CN115794324A - 任务处理方法、装置及存储介质 - Google Patents
任务处理方法、装置及存储介质 Download PDFInfo
- Publication number
- CN115794324A CN115794324A CN202210761738.4A CN202210761738A CN115794324A CN 115794324 A CN115794324 A CN 115794324A CN 202210761738 A CN202210761738 A CN 202210761738A CN 115794324 A CN115794324 A CN 115794324A
- Authority
- CN
- China
- Prior art keywords
- task
- thread
- tasks
- processing
- circular queue
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请提供一种任务处理方法、装置及存储介质,该方法通过预设线程接收至少一个任务处理消息,进而,根据其中每一个任务处理消息对应的处理函数和输入参数,在任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示线程池中的至少一个线程从上述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,这里线程池中的一个线程读取一个任务,从而,使得线程池中的每个线程与任务是解耦的,每个线程的工作机制都一样,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种任务处理方法、装置及存储介质。
背景技术
随着互联网技术的不断发展,用户对影响延迟的要求越来越高。在一些操作系统中,如在实时多任务操作系统(Real Time Operating System,RTOS)微内核系统中,很多服务目前多是单线程工作,容易造成任务堵塞,处理耗时较长,影响用户感知,急需进行多线程扩展。
相关技术中,多线程扩展的实现方式是在预设线程中创建多个线程,每个线程注册一个处理函数,这样达到多线程处理的效果。
但是,上述多线程处理中,每个线程与任务强相关,只能负责具体的任务,灵活性较差,而且,每个线程有每个线程的实现方式,无法统一。
发明内容
本申请提供一种任务处理方法、装置及存储介质,以解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
第一方面,本申请实施例提供一种任务处理方法,所述方法应用于预设线程,所述方法包括:
在接收到至少一个任务处理消息后,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,所述每一个任务处理消息携带输入参数;
根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,所述信号量在对应的任务写入完成后发送至预设线程池,所述信号量用于指示所述预设线程池中的至少一个线程从所述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理所述读取的任务,所述预设线程池中的一个线程读取一个任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,包括:
若根据所述每一个任务处理消息对应的处理函数和输入参数,在所述循环队列中写入任务过程中,所述循环队列写满任务,则根据所述每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在所述链表中写入任务,其中,所述未处理的任务处理消息为未写入所述循环队列的任务对应的任务处理消息。
在一种可能的实现方式中,所述根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,包括:
确定所述每一个任务处理消息的接收顺序;
根据所述每一个任务处理消息对应的处理函数和输入参数,按照所述每一个任务处理消息的接收顺序,在所述循环队列中写入任务。
在一种可能的实现方式中,所述确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,包括:
获取预存的消息与处理函数的对应关系;
根据所述对应关系,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数。
在一种可能的实现方式中,还包括:
申请消息存储空间;
在所述接收到至少一个任务处理消息之后,还包括:
将所述至少一个任务处理消息存储在所述消息存储空间。
第二方面,本申请实施例提供另一种任务处理方法,所述方法应用于预设线程池中的至少一个线程,所述方法包括:
在接收到信号量后,根据所述信号量,从预设任务池的循环队列中读取任务,其中,所述信号量为预设线程在所述循环队列中将对应的任务写入完成后发送的,所述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,所述预设线程池中的一个线程读取一个任务;
根据读取的任务对应的处理函数和输入参数,处理所述读取的任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述信号量,从预设任务池的循环队列中读取任务,包括:
若确定所述循环队列中有写入的任务,则根据所述信号量,从所述循环队列中读取任务;
若确定所述循环队列中没有写入的任务,则根据所述信号量,从所述链表中读取任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述信号量,从预设任务池的循环队列中读取任务,包括:
确定所述循环队列和所述链表中任务的写入顺序;
根据所述信号量,按照所述任务的写入顺序,从所述循环队列和/或所述链表中读取任务。
第三方面,本申请实施例提供一种任务处理装置,所述装置应用于预设线程,所述装置包括:
函数确定模块,用于在接收到至少一个任务处理消息后,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,所述每一个任务处理消息携带输入参数;
任务写入模块,用于根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,所述信号量在对应的任务写入完成后发送至预设线程池,所述信号量用于指示预设线程池中的至少一个线程从所述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理所述读取的任务,所述预设线程池中的一个线程读取一个任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务写入模块,具体用于:
若根据所述每一个任务处理消息对应的处理函数和输入参数,在所述循环队列中写入任务过程中,所述循环队列写满任务,则根据所述每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在所述链表中写入任务,其中,所述未处理的任务处理消息为未写入所述循环队列的任务对应的任务处理消息。
在一种可能的实现方式中,所述任务写入模块,具体用于:
确定所述每一个任务处理消息的接收顺序;
根据所述每一个任务处理消息对应的处理函数和输入参数,按照所述每一个任务处理消息的接收顺序,在所述循环队列中写入任务。
在一种可能的实现方式中,所述函数确定模块,具体用于:
获取预存的消息与处理函数的对应关系;
根据所述对应关系,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数。
在一种可能的实现方式中,所述函数确定模块还用于:
申请消息存储空间,在接收到所述至少一个任务处理消息之后,将所述至少一个任务处理消息存储在所述消息存储空间。
第四方面,本申请实施例提供另一种任务处理装置,所述装置应用于预设线程池中的至少一个线程,所述装置包括:
任务读取模块,用于在接收到信号量后,根据所述信号量,从预设任务池的循环队列中读取任务,其中,所述信号量为预设线程在所述循环队列中将对应的任务写入完成后发送的,所述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,所述预设线程池中的一个线程读取一个任务;
任务处理模块,用于根据读取的任务对应的处理函数和输入参数,处理所述读取的任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务读取模块,具体用于:
若确定所述循环队列中有写入的任务,则根据所述信号量,从所述循环队列中读取任务;
若确定所述循环队列中没有写入的任务,则根据所述信号量,从所述链表中读取任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务读取模块,具体用于:
确定所述循环队列和所述链表中任务的写入顺序;
根据所述信号量,按照所述任务的写入顺序,从所述循环队列和/或所述链表中读取任务。
第五方面,本申请实施例提供一种任务处理设备,包括:
处理器;
存储器;以及
计算机程序;
其中,所述计算机程序被存储在所述存储器中,并且被配置为由所述处理器执行,所述计算机程序包括用于执行如第一方面所述的方法的指令。
第六方面,本申请实施例提供另一种任务处理设备,包括:
处理器;
存储器;以及
计算机程序;
其中,所述计算机程序被存储在所述存储器中,并且被配置为由所述处理器执行,所述计算机程序包括用于执行如第二方面所述的方法的指令。
第七方面,本申请实施例提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序使得服务器执行第一方面所述的方法。
第八方面,本申请实施例提供另一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序使得服务器执行第二方面所述的方法。
第九方面,本申请实施例提供一种计算机程序产品,包括计算机指令,所述计算机指令被处理器执行第一方面所述的方法。
第十方面,本申请实施例提供另一种计算机程序产品,包括计算机指令,所述计算机指令被处理器执行第二方面所述的方法。
本申请实施例提供的任务处理方法、装置及存储介质,该方法通过预设线程接收至少一个任务处理消息,并确定该至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,上述消息携带输入参数,进而,根据每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示预设线程池中的至少一个线程从上述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,这里预设线程池中的一个线程读取一个任务,从而,使得线程池中的每个线程与任务是解耦的,每个线程的工作机制都一样,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。而且,上述循环队列可以实现任务读写分离,提高了任务读写的性能。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本申请实施例提供的任务处理系统架构示意图;
图2为本申请实施例提供的一种任务处理方法的流程示意图;
图3A为本申请实施例提供的一种循环队列的示意图;
图3B为本申请实施例提供的一种在循环队列中写入任务的示意图;
图3C为本申请实施例提供的一种在循环队列中读取任务的示意图;
图3D为本申请实施例提供的另一种在循环队列中写入任务的示意图;
图3E为本申请实施例提供的一种在循环队列写满任务的示意图;
图3F为本申请实施例提供的一种在链表写入任务的示意图;
图4为本申请实施例提供的另一种任务处理方法的流程示意图;
图5为本申请实施例提供的再一种任务处理方法的流程示意图;
图6为本申请实施例提供的一种任务处理装置的结构示意图;
图7为本申请实施例提供的另一种任务处理装置的结构示意图;
图8A为本申请实施例提供的一种任务处理设备的基本硬件架构示意图;
图8B为本申请实施例提供的另一种任务处理设备的基本硬件架构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”及“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本申请的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
现有在一些操作系统中,如在RTOS微内核系统中,很多服务目前多是单线程工作,容易造成任务堵塞,处理耗时较长,影响用户感知,急需进行多线程扩展。常规的多线程扩展是在主线程中创建多个线程,每个线程注册一个处理函数,这样达到多线程处理的效果。但是,上述多线程处理中,每个线程与任务强相关,只能负责具体的任务,灵活性较差,而且,每个线程有每个线程的实现方式,无法统一。
因此,本申请实施例提出一种任务处理方法,通过建立任务池和线程池进行任务处理,其中,任务池中包括循环队列,主线程在该循环队列中写入任务,每一任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示线程池中的线程从上述循环队列中读取任务,一个线程读取一个任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
可选地,本申请实施例提供的任务处理方法可应用于系统中进行多线程扩展处理任务的场景,从而避免任务堵塞,减少处理耗时,提高用户体验。另外,本申请实施例提供的任务处理方法的应用场景还有很多,任何采用本申请任务处理方法的场景都在本申请的范围内。
示例性的,本申请实施例提供的任务处理方法可以应用于如图1所示的任务处理系统中。在图1中,该系统架构可以包括预设线程、任务池和线程池。其中,上述任务池中包括循环队列(图中以work_queue表示循环队列),该循环队列用于存储任务。上述线程池中包括多个线程(图中以Worker1、Worker2…Workern表示多个线程,n可以根据实际情况确定,例如5)。
在具体实现过程中,预设线程在接收到至少一个任务处理消息后,确定该至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,上述消息携带输入参数,进而,根据每一个任务处理消息对应的处理函数和输入参数,在上述任务池的循环队列中写入任务。
这里,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示上述线程池中的线程从上述循环队列中读取任务,一个线程读取一个任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,从而,使得上述线程池中的每个线程与任务是解耦的,每个线程的工作机制都一样,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
可选地,上述任务池中还可以包括链表(图中以work_list表示链表),该链表用于存储任务。在上述循环队列写满任务时,上述预设线程可以根据每一个任务处理消息对应的处理函数和输入参数,在上述链表中写入任务,有效弥补了循环队列丢失信息的问题。
下面以几个实施例为例对本申请的技术方案进行描述,对于相同或相似的概念或过程可能在某些实施例不再赘述。
图2为本申请实施例提供的一种任务处理方法的流程示意图,本实施例的执行主体可以为图1中的预设线程,具体执行主体可以根据实际应用场景确定,本申请实施例对此不做特别限制。如图2所示,本申请实施例提供的任务处理方法可以包括如下步骤:
S201:在接收到至少一个任务处理消息后,确定该至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,每一个任务处理消息携带输入参数。
这里,上述预设线程可以接收一个或多个任务处理消息,在接收到一个或多个任务处理消息后,可以获取预存的消息与处理函数的对应关系,从而,根据该对应关系,确定上述一个或多个任务处理消息中每一个任务处理消息对应的处理函数。
其中,上述对应关系可以根据实际情况确定,例如上述预设线程获取用户的设置请求,该设置请求携带多个消息与处理函数对应关系,进而,根据该设置请求携带的对应关系,确定上述消息与处理函数的对应关系。
在本申请实施例中,上述每一个任务处理消息携带输入参数以a和b为例,上述预设线程根据上述对应关系,确定每一个任务处理消息对应的处理函数,如计算输入参数的相加之和,即计算a与b的相加之和。
可选地,上述预设线程还可以申请消息存储空间,在接收到上述至少一个任务处理消息之后,将上述至少一个任务处理消息存储在上述消息存储空间,从而避免在先接收的消息被在后接收的消息覆盖,保证后续处理准确进行。
另外,上述任务处理消息可以是进程间通信(Inter-Process Communication,IPC)消息,用于各种进程间通信,满足实际应用需要。
S202:根据每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务。
其中,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量在对应的任务写入完成后发送至预设线程池,该信号量用于指示该预设线程池中的至少一个线程从上述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,上述预设线程池中的一个线程读取一个任务。
这里,上述预设线程可以通过任务池提供的接口在任务池中添加任务(下述以work item表示任务)。其中,上述任务池可以包括循环队列(下述以work_queue表示循环队列),work_queue可以由任务个数count、下一个任务存储的位置write_index、下一个任务读取的位置read_index以及任务集合work组成。
在本申请实施例中,work_queue是一个循环队列的实现机制,上述预设线程可以往write_index的位置存储任务,上述线程池中的线程可以从read_index的位置读取任务执行,这样可以实现读写分离,即上述预设线程在往work_queue中存储任务的时候,上述线程池中的线程同时也可以从work_queue中读取任务执行,提高了任务读写的性能。
示例性的,上述预设线程往write_index的位置存储任务,上述线程池中的线程从read_index的位置读取任务的具体机制可以如图3A-3F所示,图中假设work_queue最大长度为8。如图3A所示,一开始work_queue是空的,然后,上述预设线程根据接收的每一个任务处理消息对应的处理函数和输入参数,在work_queue中写入3个任务,如图3B所示。其中,在写入任务时,上述主程序可以先确定上述每一个任务处理消息的接收顺序,进而,根据上述每一个任务处理消息对应的处理函数,按照上述每一个任务处理消息的接收顺序,在work_queue中写入任务。例如图3B中,上述预设线程可以根据上述每一个任务处理消息对应的处理函数和输入参数,按照先接收先写入的方式,从左往右,在work_queue中写入3个任务,从而使得先接收的任务处理消息对应的任务先写入work_queue,后续在读取任务时可以对先写入的任务先读取,满足实际应用需要。
这里,每一写入的任务携带对应的处理函数和信号量,在某一任务写入完成后,预设线程通过信号量来实现与线程池中的线程的同步,即预设线程通过相应的信号量通知线程池中的线程从work_queue中读取任务,如图3C所示,线程池中的线程根据上述信号量从work_queue中读取了2个任务,其中,线程池中的一个线程读取一个任务。这样,线程池中的每个线程与任务是解耦的,灵活性较好,易于扩展,而且,每个线程的工作机制都一样,使得多个线程的实现方式统一。
可选地,如果预设线程继续接收到任务处理消息,则进一步根据接收的任务处理消息中每一个任务处理消息对应的处理函数和输入参数,在work_queue中写入任务。例如如图3D所示,预设线程又在work_queue中写入了5个任务,并且在写入5个任务后,预设线程又接收到任务处理消息,进而,根据接收的任务处理消息中每一个任务处理消息对应的处理函数和输入参数,又在work_queue中写入了2个任务,这时work_queue满了,如图3E所示。
在本申请实施例中,上述任务池还包括链表(下述以work_list表示链表),该work_list用于存储任务。上述预设线程在根据接收的每一个任务处理消息对应的处理函数和输入参数,在work_queue中写入任务时,如果在写入过程中,work_queue写满任务,则可以根据接收的每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在上述work_list中写入任务,其中,上述未处理的任务处理消息为未写入work_queue的任务对应的任务处理消息。例如如图3F所示,预设线程如果还往线程池中写入任务,work_queue满了,这时,把任务写入work_list中。
这里,work_queue的一个好处是可以实现读写分离,即一边往work_queue里写,另一边从work_queue里读,可以提高性能。但是work_queue有个缺点,就是队列的最大长度是事先定死的,在极端情况下会导致队列塞满而丢失信息,所以本申请实施例增加了work_list这个链表结构来临时存储在极端情况下出现的多余任务,有效弥补了work_queue丢失信息的问题,即本申请实施例采用混合使用work_queue+work_list的形式来实现任务池的管理,即有效提高了任务池的性能,又解决了极端情况下不丢失任务的问题。
本申请实施例通过预设线程接收至少一个任务处理消息,并确定该至少一个任务处理消息中每一个任务处理消息对应的处理函数,上述消息携带输入参数,进而,根据每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示预设线程池中的至少一个线程从上述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,这里预设线程池中的一个线程读取一个任务,从而,使得线程池中的每个线程与任务是解耦的,每个线程的工作机制都一样,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
另外,上述图2从预设线程这侧提供一种任务处理方法的流程示意图,图4从上述线程池中线程这侧提供另一种任务处理方法的流程示意图,其中,图4与图2实现相同的步骤,参照图2中相应描述,此处不再赘述。如图4所示,该方法包括:
S401:在接收到信号量后,根据该信号量,从预设任务池的循环队列中读取任务。
其中,上述信号量为预设线程在上述循环队列中将对应的任务写入完成后发送的,上述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,上述线程池中的一个线程读取一个任务。
这里,上述任务池还包括链表,该链表用于存储任务。上述线程池中线程在根据上述信号量,从上述循环队列中读取任务时,如果确定上述循环队列中有写入的任务,则根据上述信号量,从上述循环队列中读取任务,如果确定上述循环队列中没有写入的任务,则根据上述信号量,从上述链表中读取任务。
在本申请实施例考虑到循环队列可以实现读写分离,提高任务读写的性能,因此在设置了读取任务的优先级,将循环队列的读取优先级设置高于链表的读取优先级,从而,在循环队列中有写入的任务时,从循环队列中读取任务,在循环队列中没有写入的任务时,从链表中读取任务,提高任务读写的性能。
可选地,为了使先写入任务池的任务后续被先读取,上述线程池中的线程在从上述任务池中读取任务时,可以先确定上述循环队列和链表中任务的写入顺序,从而,根据上述信号量,按照上述任务的写入顺序,从上述循环队列和/或链表中读取任务,满足多种应用需要。
S402:根据读取的任务对应的处理函数和输入参数,处理读取的任务。
这里,以读取的任务对应的处理函数为计算输入参数的相加之和,输入参数为a和b为例,上述线程池中的线程根据读取的任务对应的处理函数和输入参数,处理读取的任务,即计算a+b的相加之和。
另外,上述线程池中的线程在从上述任务池中读取任务后,可以存储读取的任务对应的处理函数和输入参数,进而,根据读取的任务对应的处理函数和输入参数,处理读取的任务,保证任务的正常处理,并在处理完成后,释放上述存储的读取的任务对应的处理函数和输入参数等,即释放空间,方便后续继续进行任务处理。
本申请实施例通过线程池中的线程接收信号量,根据该信号量,从任务池的循环队列中读取任务,其中,上述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,上述线程池中的一个线程读取一个任务,进而,根据读取的任务对应的处理函数和输入参数,处理读取的任务,从而,使得线程池中的每个线程与任务是解耦的,每个线程的工作机制都一样,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。
可选地,图5为本申请实施例提供再一种任务处理方法的流程示意图,其中,图5从上述预设线程在任务池中写入数据,线程池中线程从任务池中读取数据描述方案。如图5所示,该方法包括:
S501:上述预设线程申请消息存储空间。
S502:上述预设线程判断是否接收到至少一个任务处理消息。
S503:在接收到上述至少一个任务处理消息后,上述预设线程将上述至少一个任务处理消息存储在上述消息存储空间,并确定上述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,每一个任务处理消息携带输入参数。
其中,上述预设线程可以获取预存的消息与处理函数的对应关系,进而,根据该对应关系,确定上述至少一个任务处理消息中每一个任务处理消息对应的处理函数。
S504:上述预设线程根据上述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,该信号量在对应的任务写入完成后发送至上述线程池。
示例性的,上述预设线程可以先确定上述每一个任务处理消息的接收顺序,然后根据上述每一个任务处理消息对应的处理函数和输入参数,按照上述每一个任务处理消息的接收顺序,在上述循环队列中写入任务。
可选地,上述任务池还包括链表,该链表用于存储任务。上述预设线程在上述任务池的循环队列中写入任务时,如果在写入任务过程中,上述循环队列写满任务,则可以根据上述每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在上述链表中写入任务,其中,上述未处理的任务处理消息为未写入上述循环队列的任务对应的任务处理消息。
S505:上述线程池中的线程确定是否接收到上述信号量。
S506:在接收到上述信号量后,上述线程池中的线程根据上述信号量,从上述任务池的循环队列中读取任务,其中,上述线程池中的一个线程读取一个任务。
可选地,上述线程池中的线程可以先确定上述循环队列中是否有写入的任务,如果确定上述循环队列中有写入的任务,则根据上述信号量,从上述循环队列中读取任务,如果确定上述循环队列中没有写入的任务,则根据上述信号量,从上述链表中读取任务。
这里,如果要使先写入的任务先读取处理,上述线程池中的线程还可以先确定上述循环队列和链表中任务的写入顺序,进而,根据上述信号量,按照上述任务的写入顺序,从上述循环队列和/或链表中读取任务,从而保证先写入的任务被先读取处理。
S507:上述线程池中的线程根据读取的任务对应的处理函数和输入参数,处理读取的任务。
与现有技术相比,本申请实施例通过建立任务池和线程池进行任务处理,其中,任务池中包括循环队列,预设线程在该循环队列中写入任务,每一任务携带对应的处理函数、输入参数和信号量,该信号量用于在对应的任务写入完成后,指示线程池中的线程从上述循环队列中读取任务,一个线程读取一个任务,并根据读取的任务对应的处理函数和输入参数,处理读取的任务,解决现有多线程处理中每个线程与任务强相关,灵活性较差,且多个线程的实现方式无法统一的问题。而且,本申请实施例通过循环队列实现读写分离,提高性能,通过链表来临时存储在极端情况下出现的多余任务,有效弥补了循环队列丢失信息的问题。
对应于上文实施例的任务处理方法,图6为本申请实施例提供的任务处理装置的结构示意图。为了便于说明,仅示出了与本申请实施例相关的部分。图6为本申请实施例提供的一种任务处理装置的结构示意图,该任务处理装置60包括:函数确定模块601和任务写入模块602。这里的任务处理装置可以是上述预设线程本身,或者是实现预设线程的功能的芯片或者集成电路。这里需要说明的是,函数确定模块和任务写入模块的划分只是一种逻辑功能的划分,物理上两者可以是集成的,也可以是独立的。
其中,函数确定模块601,用于在接收到至少一个任务处理消息后,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,所述每一个任务处理消息携带输入参数。
任务写入模块602,用于根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,所述信号量在对应的任务写入完成后发送至预设线程池,所述信号量用于指示所述预设线程池中的至少一个线程从所述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理所述读取的任务,所述预设线程池中的一个线程读取一个任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务写入模块602,具体用于:
若根据所述每一个任务处理消息对应的处理函数和输入参数,在所述循环队列中写入任务过程中,所述循环队列写满任务,则根据所述每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在所述链表中写入任务,其中,所述未处理的任务处理消息为未写入所述循环队列的任务对应的任务处理消息。
在一种可能的实现方式中,所述任务写入模块602,具体用于:
确定所述每一个任务处理消息的接收顺序;
根据所述每一个任务处理消息对应的处理函数和输入参数,按照所述每一个任务处理消息的接收顺序,在所述循环队列中写入任务。
在一种可能的实现方式中,所述函数确定模块601,具体用于:
获取预存的消息与处理函数的对应关系;
根据所述对应关系,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数。
在一种可能的实现方式中,所述函数确定模块601还用于:
申请消息存储空间,在接收到所述至少一个任务处理消息之后,将所述至少一个任务处理消息存储在所述消息存储空间。
本申请实施例提供的装置,可用于执行上述图2所述方法实施例的技术方案,其实现原理和技术效果类似,本申请实施例此处不再赘述。
图7为本申请实施例提供的另一种任务处理装置的结构示意图,该任务处理装置70包括:任务读取模块701和任务处理模块702。这里的任务处理装置可以是上述线程池中线程本身,或者是实现上述线程池中线程的功能的芯片或者集成电路。这里需要说明的是,任务读取模块和任务处理模块的划分只是一种逻辑功能的划分,物理上两者可以是集成的,也可以是独立的。
其中,任务读取模块701,用于在接收到信号量后,根据所述信号量,从预设任务池的循环队列中读取任务,其中,所述信号量为预设线程在所述循环队列中将对应的任务写入完成后发送的,所述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,所述预设线程池中的一个线程读取一个任务。
任务处理模块702,用于根据读取的任务对应的处理函数和输入参数,处理所述读取的任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务读取模块701,具体用于:
若确定所述循环队列中有写入的任务,则根据所述信号量,从所述循环队列中读取任务;
若确定所述循环队列中没有写入的任务,则根据所述信号量,从所述链表中读取任务。
在一种可能的实现方式中,所述预设任务池还包括链表,所述链表用于存储任务。
所述任务读取模块701,具体用于:
确定所述循环队列和所述链表中任务的写入顺序;
根据所述信号量,按照所述任务的写入顺序,从所述循环队列和/或所述链表中读取任务。
本申请实施例提供的装置,可用于执行上述图4所述方法实施例的技术方案,其实现原理和技术效果类似,本申请实施例此处不再赘述。
可选地,图8A和8B示意性地提供本申请所述任务处理设备的一种可能的基本硬件架构示意图。
参见图8A和8B,任务处理设备800包括至少一个处理器801以及通信接口803。其中,处理器801可以创建上述预设线程、任务池和线程池。进一步可选的,还可以包括存储器802和总线804。
其中,任务处理设备800中,处理器801的数量可以是一个或多个,图8A和8B仅示意了其中一个处理器801。可选地,处理器801,可以是中央处理器(central processingunit,CPU)、图形处理器(graphics processing unit,GPU)或者数字信号处理器(digitalsignal processor,DSP)。如果任务处理设备800具有多个处理器801,多个处理器801的类型可以不同,或者可以相同。可选地,任务处理设备800的多个处理器801还可以集成为多核处理器。
存储器802存储计算机指令和数据;存储器802可以存储实现本申请提供的上述任务处理方法所需的计算机指令和数据,例如,存储器802存储用于实现上述任务处理方法的步骤的指令。存储器802可以是以下存储介质的任一种或任一种组合:非易失性存储器(例如只读存储器(ROM)、固态硬盘(SSD)、硬盘(HDD)、光盘),易失性存储器。
通信接口803可以为所述至少一个处理器提供信息输入/输出。也可以包括以下器件的任一种或任一种组合:网络接口(例如以太网接口)、无线网卡等具有网络接入功能的器件。
可选的,通信接口803还可以用于任务处理设备800与其它计算设备或者任务处理设备进行数据通信。
进一步可选的,图8A和8B用一条粗线表示总线804。总线804可以将处理器801与存储器802和通信接口803连接。这样,通过总线804,处理器801可以访问存储器802,还可以利用通信接口803与其它计算设备或者任务处理设备进行数据交互。
在本申请中,任务处理设备800执行存储器802中的计算机指令,使得任务处理设备800实现本申请提供的上述任务处理方法,或者使得任务处理设备800部署上述的任务处理装置。
从逻辑功能划分来看,示例性的,如图8A和8B所示,存储器802中可以包括函数确定模块601和任务写入模块602。这里的包括仅仅涉及存储器中所存储的指令被执行时可以分别实现函数确定模块和任务写入模块的功能,而不限定是物理上的结构。
示例性的,如图8B所示,存储器802中可以包括任务读取模块701和任务处理模块702。这里的包括仅仅涉及存储器中所存储的指令被执行时可以实现任务读取模块和任务处理模块的功能,而不限定是物理上的结构。
另外,上述的任务处理设备除了可以像上述图8A和8B通过软件实现外,也可以作为硬件模块,或者作为电路单元,通过硬件实现。
本申请提供一种计算机可读存储介质,所述计算机程序产品包括计算机指令,所述计算机指令指示计算设备执行本申请提供的上述任务处理方法。
本申请提供一种计算机程序产品,包括计算机指令,所述计算机指令被处理器执行上述任务处理方法。
本申请提供一种芯片,包括至少一个处理器和通信接口,所述通信接口为所述至少一个处理器提供信息输入和/或输出。进一步,所述芯片还可以包含至少一个存储器,所述存储器用于存储计算机指令。所述至少一个处理器用于调用并运行该计算机指令,以执行本申请提供的上述任务处理方法。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
Claims (13)
1.一种任务处理方法,其特征在于,所述方法应用于预设线程,所述方法包括:
在接收到至少一个任务处理消息后,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,所述每一个任务处理消息携带输入参数;
根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,所述信号量在对应的任务写入完成后发送至预设线程池,所述信号量用于指示所述预设线程池中的至少一个线程从所述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理所述读取的任务,所述预设线程池中的一个线程读取一个任务。
2.根据权利要求1所述的方法,其特征在于,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,包括:
若根据所述每一个任务处理消息对应的处理函数和输入参数,在所述循环队列中写入任务过程中,所述循环队列写满任务,则根据所述每一个任务处理消息中未处理的任务处理消息对应的处理函数和输入参数,在所述链表中写入任务,其中,所述未处理的任务处理消息为未写入所述循环队列的任务对应的任务处理消息。
3.根据权利要求1所述的方法,其特征在于,所述根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,包括:
确定所述每一个任务处理消息的接收顺序;
根据所述每一个任务处理消息对应的处理函数和输入参数,按照所述每一个任务处理消息的接收顺序,在所述循环队列中写入任务。
4.根据权利要求1至3中任一项所述的方法,其特征在于,所述确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,包括:
获取预存的消息与处理函数的对应关系;
根据所述对应关系,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数。
5.根据权利要求1至3中任一项所述的方法,其特征在于,还包括:
申请消息存储空间;
在所述接收到至少一个任务处理消息之后,还包括:
将所述至少一个任务处理消息存储在所述消息存储空间。
6.一种任务处理方法,其特征在于,所述方法应用于预设线程池中的至少一个线程,所述方法包括:
在接收到信号量后,根据所述信号量,从预设任务池的循环队列中读取任务,其中,所述信号量为预设线程在所述循环队列中将对应的任务写入完成后发送的,所述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,所述预设线程池中的一个线程读取一个任务;
根据读取的任务对应的处理函数和输入参数,处理所述读取的任务。
7.根据权利要求6所述的方法,其特征在于,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述信号量,从预设任务池的循环队列中读取任务,包括:
若确定所述循环队列中有写入的任务,则根据所述信号量,从所述循环队列中读取任务;
若确定所述循环队列中没有写入的任务,则根据所述信号量,从所述链表中读取任务。
8.根据权利要求6所述的方法,其特征在于,所述预设任务池还包括链表,所述链表用于存储任务;
所述根据所述信号量,从预设任务池的循环队列中读取任务,包括:
确定所述循环队列和所述链表中任务的写入顺序;
根据所述信号量,按照所述任务的写入顺序,从所述循环队列和/或所述链表中读取任务。
9.一种任务处理装置,其特征在于,所述装置应用于预设线程,所述装置包括:
函数确定模块,用于在接收到至少一个任务处理消息后,确定所述至少一个任务处理消息中每一个任务处理消息对应的处理函数,其中,所述每一个任务处理消息携带输入参数;
任务写入模块,用于根据所述每一个任务处理消息对应的处理函数和输入参数,在预设任务池的循环队列中写入任务,其中,每一写入的任务携带对应的处理函数、输入参数和信号量,所述信号量在对应的任务写入完成后发送至预设线程池,所述信号量用于指示所述预设线程池中的至少一个线程从所述循环队列中读取任务,并根据读取的任务对应的处理函数和输入参数,处理所述读取的任务,所述预设线程池中的一个线程读取一个任务。
10.一种任务处理装置,其特征在于,所述装置应用于预设线程池中的至少一个线程,所述装置包括:
任务读取模块,用于在接收到信号量后,根据所述信号量,从预设任务池的循环队列中读取任务,其中,所述信号量为预设线程在所述循环队列中将对应的任务写入完成后发送的,所述循环队列中每一写入的任务携带对应的处理函数、输入参数和信号量,所述预设线程池中的一个线程读取一个任务;
任务处理模块,用于根据读取的任务对应的处理函数和输入参数,处理所述读取的任务。
11.一种任务处理设备,其特征在于,包括:
处理器;
存储器;以及
计算机程序;
其中,所述计算机程序被存储在所述存储器中,并且被配置为由所述处理器执行,所述计算机程序包括用于执行如权利要求1-5任一项所述的方法的指令,和/或,所述计算机程序包括用于执行如权利要求6-8任一项所述的方法的指令。
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序使得服务器执行权利要求1-5任一项所述的方法,和/或,所述计算机程序使得服务器执行权利要求6-8任一项所述的方法。
13.一种计算机程序产品,其特征在于,包括计算机指令,所述计算机指令被处理器执行权利要求1-5任一项所述的方法,和/或,所述计算机指令被处理器执行权利要求6-8任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210761738.4A CN115794324A (zh) | 2022-07-01 | 2022-07-01 | 任务处理方法、装置及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210761738.4A CN115794324A (zh) | 2022-07-01 | 2022-07-01 | 任务处理方法、装置及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115794324A true CN115794324A (zh) | 2023-03-14 |
Family
ID=85431274
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210761738.4A Pending CN115794324A (zh) | 2022-07-01 | 2022-07-01 | 任务处理方法、装置及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115794324A (zh) |
-
2022
- 2022-07-01 CN CN202210761738.4A patent/CN115794324A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110489213B (zh) | 一种任务处理方法及处理装置、计算机系统 | |
JP4072271B2 (ja) | 複数のオペレーティングシステムを実行する計算機 | |
US6671827B2 (en) | Journaling for parallel hardware threads in multithreaded processor | |
EP2613269A1 (en) | Multi-core processor system, synchronisation control system, synchronisation control device, information generation method, and information generation programme | |
US20140337848A1 (en) | Low overhead thread synchronization using hardware-accelerated bounded circular queues | |
CN115269196A (zh) | 线程池动态创建方法、装置、设备及存储介质 | |
US20140026143A1 (en) | Exclusive access control method and computer product | |
CN111078323A (zh) | 基于协程的数据处理方法、装置、计算机设备及存储介质 | |
CN109522128B (zh) | 分段式多线程任务执行方法及装置 | |
CN114637536A (zh) | 任务处理方法、计算协处理器、芯片及计算机设备 | |
CN115599510A (zh) | 一种缺页异常的处理方法及相应装置 | |
CN115033352A (zh) | 多核处理器任务调度方法、装置及设备、存储介质 | |
CN112256421A (zh) | 通信处理方法、装置、存储介质及电子设备 | |
TW200903338A (en) | Transactional debugger for a transactional memory system | |
WO2018022303A1 (en) | Capturing commands in a multi-engine graphics processing unit | |
US8868876B2 (en) | Dedicated large page memory pools | |
CN108958903B (zh) | 嵌入式多核中央处理器任务调度方法与装置 | |
US20130262812A1 (en) | Hardware Managed Allocation and Deallocation Evaluation Circuit | |
CN117707721A (zh) | 任务提交方法、电子设备及存储介质 | |
CN109800166B (zh) | 一种嵌入式实时操作系统的调试方法及装置 | |
CN111310638A (zh) | 一种数据处理方法、装置及计算机可读存储介质 | |
CN115794324A (zh) | 任务处理方法、装置及存储介质 | |
CN115905040A (zh) | 计数器的处理方法、图形处理器、设备及存储介质 | |
CN113032154B (zh) | 一种虚拟cpu的调度方法、装置、电子设备及存储介质 | |
US7603673B2 (en) | Method and system for reducing context switch times |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |