一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种数据处理的方法、装置和存储介质与流程

2021-12-17 22:19:00 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种数据处理的方法、装置和存储介质。


背景技术:

2.在日常的开发工作当中,为提高系统并发量和增加吞吐量,线程池在一个应用中承担着重要的角色。根据线程池的运行原理,主要分为两个步骤,一是增加任务,把任务放到阻塞队列中(如有界队列arrayblockingqueue,无界队列linkedblockingqueue,延迟队列delayqueue,锁队列synchronousqueue等),该阶段存放任务主要消耗服务器资源即内存;二是执行任务,该阶段主要消耗服务器资源即中央处理器(central processing unit,cpu)。但内存空间是有限资源,这就使得在增加任务和执行任务的过程中增加内存的消耗,当达到内存上限内存溢出就会导致系统不可用,当并发量持续升高,极端情况会引起所有服务宕机。如使用有界队列arrayblockingqueue,当再提交任务超过队列容量时,会触发拒绝策略,不能是任务正常执行;或使用无界队列linkedblockingqueue,持续提交任务,会导致内存溢出。当使用线程池现有的阻塞队列,当每秒查询率较高时都会遇到内存或者业务逻辑的非正常运行。


技术实现要素:

3.本技术实施例提供了一种数据处理的方法,克服了各个应用服务器由于内存溢出可能导致的服务不可用的问题。
4.该方法包括:
5.获取至少一个线程池提交的任务集合和所述任务集合对应的任务标识,其中,所述任务集合中包含至少一个待处理任务;
6.保存所述任务集合以及与所述任务集合对应的所述任务标识之间的映射关系;
7.响应于所述线程池创建任务线程,基于所述映射关系筛选出与该所述线程池的任务标识相匹配的所述任务集合中的至少一个所述待处理任务;
8.所述线程池获取对应的至少一个待处理任务,并将获取到的所述待处理任务缓存至该所述线程池对应的所述阻塞工作队列,等待被相应的所述任务线程执行。
9.可选地,将获取的所述待处理任务包含的任务数据进行序列化,转化为与所述待处理任务对应的字节序列。
10.可选地,在保存所述待识别任务时统计所述待识别任务的保存时长;
11.响应于所述保存时长超过该所述待识别任务所属的所述任务集合对应的预设时间阈值,停止执行保存该所述待识别任务的操作。
12.可选地,在与接收到的所述线程池发送的所述任务标识符合所述映射关系的所述任务集合中,若未获取到所述待处理任务,执行等待获取所述待处理任务的操作,直至与该所述任务集合对应的所述线程池的所述任务线程中断,和/或所述任务集合持续为空的时长超过预设时长时停止获取该所述任务集合中所述待处理任务的操作。
13.可选地,将获取的所述待处理任务中包含的所述字节序列反序列化为任务数据对象。
14.可选地,查询已保存的所述任务集合的数量及所述任务集合中包含的所述待处理任务的数量,以及所述线程池的数量和所述任务线程的数量,并调整所述线程池所在的应用服务器的数量。
15.在本发明的另一个实施例中,提供了一种数据处理的装置,该装置包括:
16.获取模块,用于获取至少一个线程池提交的任务集合和所述任务集合对应的任务标识,其中,所述任务集合中包含至少一个待处理任务;
17.保存模块,用于保存所述任务集合以及与所述任务集合对应的所述任务标识之间的映射关系;
18.筛选模块,用于响应于所述线程池创建任务线程,基于所述映射关系筛选出与该所述线程池的任务标识相匹配的所述任务集合中的至少一个所述待处理任务;
19.缓存模块,用于所述线程池获取对应的至少一个待处理任务,并将获取到的所述待处理任务缓存至该所述线程池对应的所述阻塞工作队列,等待被相应的所述任务线程执行。
20.可选地,所述获取模块进一步用于:
21.将获取的所述待处理任务包含的任务数据进行序列化,转化为与所述待处理任务对应的字节序列。
22.在本发明的另一个实施例中,提供了一种非瞬时计算机可读存储介质,所述非瞬时计算机可读存储介质存储指令,所述指令在由处理器执行时使得所述处理器执行上述一种数据处理的方法中的各个步骤。
23.在本发明的另一个实施例中,提供了一种终端设备,包括处理器,所述处理器用于执行上述一种数据处理的方法中的各个步骤。
24.基于上述实施例,首先获取至少一个线程池提交的任务集合和任务集合对应的任务标识,其中,任务集合中包含至少一个待处理任务,其次,保存任务集合以及与任务集合对应的任务标识之间的映射关系,进一步地,响应于线程池创建任务线程,基于映射关系筛选出与该线程池的任务标识相匹配的任务集合中的至少一个待处理任务,最后,线程池获取对应的至少一个待处理任务,并将获取到的待处理任务缓存至该线程池对应的阻塞工作队列,等待被相应的任务线程执行。本技术实施例通过将各个线程池的待处理任务集中提交并保存,并在后续线程池创建线程后再获取相应的待处理任务,避免各个服务器由于内存上限导致的内存溢出而服务不可用的风险,提升了数据处理效率。
附图说明
25.为了更清楚地说明本技术实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本技术的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
26.图1示出了为本技术实施例100所提供的一种数据处理的方法的数据交互场景的示意图;
27.图2示出了本技术实施例200提供的一种数据处理的方法的示意图;
28.图3示出了本技术实施例300提供的一种数据处理的方法的具体流程的示意图;
29.图4示出了本技术实施例400还提供一种数据处理的装置的示意图;
30.图5示出了本技术实施例500所提供的一种终端设备的示意图。
具体实施方式
31.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
32.本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例如能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含。例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其他步骤或单元。
33.基于现有技术中的问题,本技术实施例提供了一种数据处理的方法,主要适用于计算机技术领域。如图1所示,为本技术实施例100提供的一种数据处理的方法的数据交互场景的示意图。通过将使用线程池的各服务器将要处理的待处理任务集中提交至中心任务服务器中,后续在线程池创建任务线程后向中心任务服务器识别并获取相应的待处理任务并执行,提升各个服务器线程池的处理效率,降低内存溢出可能导致的服务不可用的风险。
34.进一步地,如图2所示,为本技术实施例200提供的一种数据处理的方法的流程示意图。其中,详细步骤如下:
35.步骤s11,获取至少一个线程池提交的任务集合和任务集合对应的任务标识,其中,任务集合中包含至少一个待处理任务。
36.本步骤中,各个应用服务器创建处理自身对应任务的线程池后,将后续需要处理的由至少一个待处理任务组成的任务集合提交至中心任务服务器。其中,中心任务服务器与各个应用服务器相独立。在提交与各个线程池对应的任务集合时同时提交该任务集合对应的任务标识。每个任务标识与相应的任务几个一一对应。
37.步骤s12,保存任务集合以及与任务集合对应的任务标识之间的映射关系。
38.本步骤中,中心任务服务器在接收到由各个线程池提交的任务集合和对应的任务标识后,在任务集合与相应的任务标识之间建立映射关系,并保存该任务集合和对应的映射关系。
39.步骤s13,响应于线程池创建任务线程,基于映射关系筛选出与该线程池的任务标识相匹配的任务集合中的至少一个待处理任务。
40.本步骤中,线程池在提交任务后,基于需要执行的待处任务创建对应的任务线程,中心任务服务器在已经保存的任务集合中筛选出与线程池的任务标识匹配的映射关系对应的任务集合,并获取任务集合中的至少一个待处理任务。
41.步骤s14,线程池获取对应的至少一个待处理任务,并将获取到的待处理任务缓存至该线程池对应的阻塞工作队列,等待被相应的任务线程执行。
42.本步骤中,各个线程池对应有用来存储等待执行的待处理任务的阻塞工作队列workqueue中,使得当前系统可以基于中央处理器的数量创建任务线程处理任务工作队列中缓存的待处理任务。进一步地,将在中心任务服务器中获取的与当前线程池相应的待处理任务缓存至阻塞工作队列中,等待后续任务线程的执行。
43.如上所述,基于上述实施例,首先获取至少一个线程池提交的任务集合和任务集合对应的任务标识,其中,任务集合中包含至少一个待处理任务,其次,保存任务集合以及与任务集合对应的任务标识之间的映射关系,进一步地,响应于线程池创建任务线程,基于映射关系筛选出与该线程池的任务标识相匹配的任务集合中的至少一个待处理任务,最后,线程池获取对应的至少一个待处理任务,并将获取到的待处理任务缓存至该线程池对应的阻塞工作队列,等待被相应的任务线程执行。本技术实施例通过将各个线程池的待处理任务集中提交并保存,并在后续线程池创建线程后再获取相应的待处理任务,避免各个服务器由于内存上限导致的内存溢出而服务不可用的风险,提升了数据处理效率。
44.如图3所示,为本技术实施例300示出的一种数据处理的方法的具体流程的示意图。其中,具体流程如下所示:
45.s201,创建中心任务服务器。
46.这里,本技术实施例中的中心任务服务器用于获取并存储各个应用服务器需要执行的待处理任务。其中,中心任务服务器优选redis中间件。具体的,由于redis以内存作为数据存储介质,和传统线程池保存任务一样,所以读写数据的效率极高,远远超过关系型数据库并且提供丰富的数据类型。同时,redis还具有以下特点:
47.(1)响应速度快
48.redis响应非常快,每秒可以执行大约110000个读操作,或者81000个写入操作,其速度远超数据库。如果存入一些常用的数据,就能有效提高系统的性能。
49.(2)支持多种数据类型
50.redis支持例如字符串、哈希结构、列表、集合、可排序集合等数据类型。其中,对于字符串可以存入一些java基础数据类型,哈希可以存储对象,列表可以存储list对象等。这使得在应用中很容易根据自己的需要选择存储的数据类型,方便开发。本技术实施例中采用list集合的数据结构,由于每个线程池执行的类型有不同,所以可以根据业务逻辑自定义所需的任务标识key,方便读取。
51.(3)操作原子性
52.应用服务器访问redis的操作都是原子的,从而确保当两个应用服务器同时访问redis服务器时,得到的是更新后的值(最新值)。当多个任务线程获取待处理任务时,由于redis是单线程的,所以同时只有一个任务线程可以获取待处理任务,确保了数据的一致性。
53.(4)持久化数据及灾备
54.目前redis持久化的方式有两种:rdb(redis database)和aof(append only file),可以把服务器内存中的数据保存在磁盘中,防止由于服务器重启导致的数据丢失。并且可以搭建redis集群,当一个服务器节点发生故障后可以通过哨兵模式切换另外一个
服务器节点,继续提供服务。确保了数据的安全性,防止了传统系统宕机任务数据丢失。
55.s202,获取至少一个线程池提交的任务集合和任务集合对应的任务标识。
56.这里,本技术实施例以创建线程池threadpoolexecutor为例,创建线程池的入参对象有任务阻塞队列workerqueue,该对象是blockingqueue<runnable>类型,所以需要自定义任务阻塞队列继承该对象重写对象中保存任务的方法。
57.由于中心服务器可以扩容,不存在空间不够的情况,所以offer(ee)和put(ee)这两个方法可以合并,并且增加一个方法入参string taskname,把数据直接提交到中心任务服务器上,可将taskname作为任务集合的任务标识。不同的线程池提交的任务标识taskname不同。
58.s203,对获取的待处理任务包含的任务数据进行序列化。
59.这里,将获取的待处理任务包含的任务数据进行序列化,转化为与待处理任务对应的字节序列。具体地,由于中心任务服务器保存数据时并不识别是否是线程池的待处理任务或是其它数据,中心任务服务器保存的数据只是二进制数据。所以线程池在提交待处理任务时,应该序列化该待处理任务,把表示为任务对象的待处理任务转换为字节序列,如序列化为json字符串提交到中心任务服务器上。
60.s204,中心任务服务器保存任务集合以及与任务集合对应的任务标识之间的映射关系。
61.本步骤中,中心任务服务器在获取到任务集合和相应的任务标识时,将任务集合和对应的任务标识之间的映射关系进行保存。进一步地,在保存待识别任务时统计待识别任务的保存时长。响应于保存时长超过该待识别任务所属的任务集合对应的预设时间阈值,停止执行保存该待识别任务的操作。具体地,通过offer(ee,long timeout,timeunit unit)方法增加一个方法入参string taskname,获取预设时间阈值timeout,若超时返回null。
62.s205,线程池创建任务线程。
63.本步骤中,在应用服务器创建了线程池后,默认情况下,线程池中并没有任何任务线程,而是等待有待处理任务到来才创建任务线程去执行待处理任务。在addthread方法中,首先用提交的待处理任务创建了一个worker对象,然后调用线程工厂threadfactory创建了一个新的任务线程,然后将任务线程的引用赋值给了worker对象的成员变量thread,接着通过workers.add(w)将worker对象添加到工作集当中。在线程创建完成之后,线程就进入了就绪(runnable)状态。
64.s206,在中心任务服务器筛选出与线程池对应的任务集合。
65.这里,响应于线程池创建任务线程,基于映射关系筛选出与该线程池的任务标识相匹配的任务集合中的至少一个待处理任务。具体地,在与接收到的线程池发送的任务标识符合映射关系的任务集合中,若未获取到待处理任务,执行等待获取待处理任务的操作,直至与该任务集合对应的线程池的任务线程中断,和/或任务集合持续为空的时长超过预设时长时停止获取该任务集合中待处理任务的操作。进一步地,使用poll、take、poll(long timeout,timeunit unit)等方法获取对应的任务集合中的待处理任务。具体地,poll():在对应的任务集合中如果没有待处理任务,直接返回null;如果有元素,则获取。take():若任务集合为空则等待直到有待处理任务或者相应任务线程被中断。poll(long timeout,
timeunit unit):如果任务集合不空则获取;如果队列已空且已经超时,返回null,如果队列已空且时间timeunit未超时,则进入等待。这三个方法同样需要增加方法入参任务标识taskname,以便于从中心任务服务器上指定的任务集合中获取待处理任务。
66.s207,线程池获取对应的至少一个待处理任务。
67.这里,线程池获取保存在中心任务服务器上相应的任务集合中的待处理任务。
68.s208,线程池对获取的待处理任务包含的任务数据进行反序列化。
69.这里,将获取的待处理任务中包含的字节序列反序列化为任务数据对象。具体地,由于各应用服务器的线程池从中心任务服务器获取的数据并不是可以识别的数据,而是字符串,所以应该反序列化为任务对象即可被线程池识别。
70.s209,将获取到的待处理任务缓存至该线程池对应的阻塞工作队列,等待被相应的任务线程执行。
71.本步骤中,各个线程池对应有任务缓存队列即workqueue,用于存放等待执行的待处理任务。其中,workqueue的类型为blockingqueue<runnable>,通常可以取三种类型:arrayblockingqueue(基于数组的先进先出队列,此队列创建时必须指定大小);linkedblockingqueue(基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为integer.max_value);synchronousqueue(这个队列比较特殊,它不会保存提交的任务,而是将直接新建一个线程来执行新来的任务)。
72.进一步地,各个任务线程首先执行通过构造器传进来的待处理任务firsttask,在调用runtask()执行完firsttask之后,在while循环里面不断通过gettask()在阻塞工作队列中取新的待处理任务来执行。gettask是threadpoolexecutor类中的方法,如果当前线程池的任务线程数大于核心池大小corepoolsize或者允许为核心池中的任务线程设置空闲存活时间,则调用poll(time,timeunit)来取待处理任务,这个方法会等待一定的时间,如果取不到待处理任务就返回null。
73.s210,基于中心任务服务器调整线程池所在服务器的数量。
74.这里,查询已保存的任务集合的数量及任务集合中包含的待处理任务的数量,以及线程池的数量和任务线程的数量,并调整线程池所在的应用服务器的数量。通过查询待处理任务的数量减少或增加应用服务器的数量。该步骤的执行可在整个数据处理的过程中进行。
75.本技术基于上述步骤实现上述一种数据处理的方法。通过将各个应用服务器的线程池需要执行的待处理任务抽取保存至独立的中心任务服务器,并在建立任务线程后获取相应的待处理任务,避免了各个应用服务器由于内存上限导致的内存溢出服务不可用的风险。同时,可通过中心任务服务器查询提交的待处理任务情况,以适当调整应用服务器的数量,防止资源的浪费。另外,该中心任务服务器支持扩容,可做共享资源以接入不同的业务系统。
76.基于同一发明构思,本技术实施例400还提供一种数据处理的装置,其中,如图4所示,该装置包括:
77.获取模块31,用于获取至少一个线程池提交的任务集合和任务集合对应的任务标识,其中,任务集合中包含至少一个待处理任务;
78.保存模块32,用于保存任务集合以及与任务集合对应的任务标识之间的映射关
系;
79.筛选模块33,用于响应于线程池创建任务线程,基于映射关系筛选出与该线程池的任务标识相匹配的任务集合中的至少一个待处理任务;
80.缓存模块34,用于线程池获取对应的至少一个待处理任务,并将获取到的待处理任务缓存至该线程池对应的阻塞工作队列,等待被相应的任务线程执行。
81.本实施例中,获取模块31、保存模块32、筛选模块33和缓存模块34的具体功能和交互方式,可参见图1对应的实施例的记载,在此不再赘述。
82.可选地,获取模块31进一步用于:
83.将获取的待处理任务包含的任务数据进行序列化,转化为与待处理任务对应的字节序列。
84.如图5所示,本技术的又一实施例500还提供一种终端设备,包括处理器501,其中,处理器501用于执行上述一种数据处理的方法的步骤。从图5中还可以看出,上述实施例提供的终端设备还包括非瞬时计算机可读存储介质502,该非瞬时计算机可读存储介质502上存储有计算机程序,该计算机程序被处理器501运行时执行上述一种数据处理的方法的步骤。实际应用中,该终端设备可以是一台或多台计算机,只要包括上述计算机可读介质和处理器即可。
85.具体地,该存储介质能够为通用的存储介质,如移动磁盘、硬盘和flash等,该存储介质上的计算机程序被运行时,能够执行上述的一种数据处理的方法中的各个步骤。实际应用中,所述的计算机可读介质可以是上述实施例中描述的设备/装置/系统中所包含的,也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或多个程序被执行时,能够执行上述的一种数据处理的方法中的各个步骤。
86.根据本技术公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(eprom或闪存)、便携式紧凑磁盘只读存储器(cd

rom)、光存储器件、磁存储器件,或者上述的任意合适的组合,但不用于限制本技术保护的范围。在本技术公开的实施例中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
87.本技术附图中的流程图和框图,示出了按照本技术公开的各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或者代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应该注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同附图中所标注的顺序发生。例如,两个连接地表示的方框实际上可以基本并行地执行,它们有时也可以按照相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或者流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
88.本领域技术人员可以理解,本公开的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,即使这样的组合或结合没有明确记载于本技术中。特别地,在
不脱离本技术精神和教导的情况下,本技术的各个实施例和/或权利要求中记载的特征可以进行多种组合和/或结合,所有这些组合和/或结合均落入本技术公开的范围。
89.最后应说明的是:以上所述实施例,仅为本技术的具体实施方式,用以说明本技术的技术方案,而非对其限制,本技术的保护范围并不局限于此,尽管参照前述实施例对本技术进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本技术揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行变更或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些变更、变化或者替换,并不使相应技术方案的本质脱离本技术实施例技术方案的精神和范围,都应涵盖在本技术的保护范围之内。因此,本技术的保护范围应所述以权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献