CN115269196A - 线程池动态创建方法、装置、设备及存储介质 - Google Patents
线程池动态创建方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN115269196A CN115269196A CN202210937120.9A CN202210937120A CN115269196A CN 115269196 A CN115269196 A CN 115269196A CN 202210937120 A CN202210937120 A CN 202210937120A CN 115269196 A CN115269196 A CN 115269196A
- Authority
- CN
- China
- Prior art keywords
- thread pool
- task
- thread
- core
- initial
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5011—Pool
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5018—Thread allocation
Abstract
本发明公开了一种线程池动态创建方法、装置、设备及存储介质,其中方法包括:接收待处理任务;将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,初始线程池包括已创建的初始线程池或新创建的初始线程池;当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数;根据新的线程池参数创建新的线程池,并将后续任务分配至新的线程池进行处理。本发明通过在接收到任务后,利用初始线程池对该任务进行处理,同时记录处理的总耗时,在结合预设期望耗时和初始线程池的核心线程数生成创建新的线程池,以更高效地处理任务,优化对系统资源的利用。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种线程池动态创建方法、装置、设备及存储介质。
背景技术
计算机程序是通过线程来执行相关任务、处理数据的,在处理并发任务或批量数据时,单线程方案的处理效率很低,一般都会选择使用多线程方案来处理。目前java开发一般使用多线程的时候,会用到线程池,ThreadPoolExecutor就是常用的线程池,在程序开发中设置线程池及其可配置的参数,完成程序开发后,可在应用程序启动之前设置相关参数。
当任务提交到线程池时,首先判断核心线程池是否已满,若没满,创建/分配一个工作线程来处理任务;若已满,则判断任务阻塞队列是否已满,若没满,按先进先出原则将新提交的任务存储在队列里等待执行;若已满,则判断整个线程池是否已满,若没满,创建/分配一个工作线程来处理任务;若已满,根据拒绝策略来处理这个任务。因此,线程池使用最核心的是线程池的参数配置,线程池若参数配置不合理,会引发故障,给系统带来不可预知的问题。目前对于线程池的参数设置都是一次性的,应用程序启动之后,就无法动态设置线程池的配置参数,而对于任务类型的不同,其最合理的线程池参数配置是不同的,例如,当业务发生变化,由CPU密集型变为IO密集型时,过多的线程会造成线程切换的消耗持续增加,进而影响到业务的响应时间,其一方面降低了系统的任务处理效率,另一方面对系统资源的利用也不够合理。
发明内容
本申请提供一种线程池动态创建线程池动态创建方法、装置、设备及存储介质,以解决现有的线程池参数配置过于呆板导致系统资源利用不合理、任务处理效率低的问题。
为解决上述技术问题,本申请采用的一个技术方案是:提供一种线程池动态创建方法,包括:接收待处理任务;将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,初始线程池包括已创建的初始线程池或新创建的初始线程池;当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数;根据新的线程池参数创建新的线程池,并将后续任务分配至新的线程池进行处理。
作为本申请的进一步改进,当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数,包括:判断待处理任务是CPU密集型任务还是IO密集型任务;当待处理任务是IO密集型任务时,根据总耗时获取待处理任务被处理时的IO读取时间、CPU计算时间;当总耗时大于预设期望耗时时,确认IO读取时间与CPU计算时间的大小关系;当IO读取时间大于等于CPU计算时间时,根据当前核心线程数和第一预设规则计算得到第一核心线程数,第一核心线程数多于当前核心线程数;当IO读取时间小于CPU计算时间时,根据当前核心线程数和第二预设规则计算得到第二核心线程数,第二核心线程数少于当前核心线程数;基于第一核心线程数或第二核心线程数,结合预先获取的用户配置参数生成新的线程池参数,新的线程池参数包括第一核心线程数或第二核心线程数、最大线程数、线程空闲时间和任务阻塞队列长度。
作为本申请的进一步改进,第一预设规则包括:第一核心线程数=(当前核心线程数+1)*125/100;第二预设规则包括:第二核心线程数=当前核心线程数*75/100+1。
作为本申请的进一步改进,将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,包括:确认待处理任务对应的任务类型,任务类型包括CPU密集型和IO密集型;判断是否存在与任务类型对应的初始线程池;若存在,则将待处理任务分配至对应的初始线程池进行处理,并记录总耗时;若不存在,则获取系统性能参数,并根据系统性能参数和任务类型创建初始线程池,并将待处理任务分配至初始线程池处理并记录总耗时。
作为本申请的进一步改进,根据系统性能参数和任务类型创建初始线程池,包括:获取系统的CPU核心数;根据任务类型和CPU核心数设置初始线程核心数,当任务类型为CPU密集型时,初始线程核心数与CPU核心数相同,当任务类型为IO密集型时,初始线程核心数为CPU核心数的二倍;根据预先获取的用户配置参数设置最大线程数、线程空闲时间和任务阻塞队列长度;根据初始线程核心数、最大线程数、线程空闲时间和任务阻塞队列长度创建初始线程池。
作为本申请的进一步改进,确认待处理任务对应的任务类型之前,还包括:获取用户预先为系统中每个应用打上的任务类型标签,任务类型标签表征每个应用产生的任务对应的任务类型。
作为本申请的进一步改进,将后续任务分配至新的线程池进行处理之后,还包括:当初始线程池和新的线程池均用于同一任务类型的任务时,在初始线程池每个线程处理完正在执行的任务后,删除初始线程池。
为解决上述技术问题,本申请采用的另一个技术方案是:提供一种线程池动态创建装置,包括:接收模块,用于接收待处理任务;记录模块,用于将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,初始线程池包括已创建的初始线程池或新创建的初始线程池;生成模块,用于当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数;创建模块,用于根据新的线程池参数创建新的线程池,并将后续任务分配至新的线程池进行处理。
为解决上述技术问题,本申请采用的再一个技术方案是:提供一种计算机设备,所述计算机设备包括处理器、与所述处理器耦接的存储器,所述存储器中存储有程序指令,所述程序指令被所述处理器执行时,使得所述处理器执行如上述中任一项所述的线程池动态创建方法的步骤。
为解决上述技术问题,本申请采用的再一个技术方案是:提供一种存储介质,存储有能够实现上述线程池动态创建方法的程序指令。
本申请的有益效果是:本申请的线程池动态创建方法通过利用初始线程池对任务进行处理,记录处理任务的总耗时,再结合初始线程池的核心线程数、总耗时和预设期望耗时生成新的线程池参数,最后根据新的线程池参数创建新的线程池并利用新的线程池处理后续任务,当某一业务产生大量同类型的任务时,根据初次执行该类型任务的情况及时调整线程池参数并构建新的线程池,以使得新的线程池能够更为合理的执行该业务产生的所有任务,其结合任务的实际情况对线程池参数进行合理的设置,大大提升了对系统资源利用的合理性以及任务执行的效率。
附图说明
图1是本发明实施例的线程池动态创建方法的流程示意图;
图2是本发明实施例的步骤S102的流程示意图;
图3是本发明实施例的步骤S103的流程示意图;
图4是本发明实施例的线程池动态创建装置的功能模块示意图;
图5是本发明实施例的计算机设备的结构示意图;
图6是本发明实施例的存储介质的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请中的术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”、“第三”的特征可以明示或者隐含地包括至少一个该特征。本申请的描述中,“多个”的含义是至少两个,例如两个,三个等,除非另有明确具体的限定。本申请实施例中所有方向性指示(诸如上、下、左、右、前、后……)仅用于解释在某一特定姿态(如附图所示)下各部件之间的相对位置关系、运动情况等,如果该特定姿态发生改变时,则该方向性指示也相应地随之改变。此外,术语“包括”和“具有”以及它们任何变形,意图在于覆盖不排他的包含。例如包含了一系列步骤或单元的过程、方法、系统、产品或设备没有限定于已列出的步骤或单元,而是可选地还包括没有列出的步骤或单元,或可选地还包括对于这些过程、方法、产品或设备固有的其它步骤或单元。
在本文中提及“实施例”意味着,结合实施例描述的特定特征、结构或特性可以包含在本申请的至少一个实施例中。在说明书中的各个位置出现该短语并不一定均是指相同的实施例,也不是与其它实施例互斥的独立的或备选的实施例。本领域技术人员显式地和隐式地理解的是,本文所描述的实施例可以与其它实施例相结合。
图1是本发明实施例的线程池动态创建方法的流程示意图。需注意的是,若有实质上相同的结果,本发明的方法并不以图1所示的流程顺序为限。如图1所示,该方法包括步骤:
步骤S101:接收待处理任务。
具体地,本实施例中的待处理任务是指系统在运行某业务时产生的任务,该系统在计算机终端上运行,该业务可以是安装在计算机终端的应用程序,当应用程序运行时,会源源不断生成大量任务发送给计算机终端的消息队列,等待CPU对这些任务进行出。
需要理解的是,本实施例中针对的待处理任务是指在由业务执行时生成的任务,这些任务具有明显的聚集性,即在一段时间内需要出的任务是由同一业务产生的,因此,这类任务在任务类型上具有较强的聚集性,很有可能是同一类型的任务。
步骤S102:将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,初始线程池包括已创建的初始线程池或新创建的初始线程池。
具体地,在接收到待处理任务后,将该待处理任务分配至初始线程池进行处理。需要理解的是,本实施例中,该初始线程数可以理解为系统启动时,默认创建的初始线程池,也可以理解为执行上一个任务的线程池,当系统存在已经创建好的初始线程池时,则将待处理任务直接分配至该初始线程池进行出,而当系统中不存在任何线程池时,则创建新的初始线程池,并将待处理任务分配至该初始线程池进行处理。在利用初始线程池处理待处理任务时,记录处理该待处理任务的总耗时,用以后续调整线程池参数。
需要理解的是,本实施例中,为了保证数据的可靠性,在接收待处理任务时,将待处理任务放入消息队列中,在记录待处理任务的总耗时时,每次以该消息队列的前三个待处理任务的平均耗时作为总耗时,例如,假设消息队列中当前存在依次排列的A、B、C、D、E五个任务,则在获取执行完A、B、C三个任务之后,以A、B、C三个任务的平均耗时作为第一个总耗时,则B、C、D三个任务的平均耗时为第二个总耗时,C、D、E三个任务的平均耗时为第三个总耗时。其通过采用平均数的方式来确认总耗时,从而提高总耗时的可信度,避免因为特例任务的存在而导致需要频繁对线程池的参数进行调整。
进一步的,为了提高任务的处理效率,本实施例中针对不同类型的任务分别采用不同参数的线程池进行处理,因此,如图2所示,该步骤S102具体包括:
步骤S201:确认待处理任务对应的任务类型,任务类型包括CPU密集型和IO密集型。
需要说明的是,本实施例中,将待处理任务分为CPU密集型和IO密集型两种任务类型。其中,CPU密集型也叫计算密集型,指的是服务器的硬盘、内存硬件性能相对CPU好很多,或者使用率低很多,系统运行CPU读写I/O(硬盘/内存)时可以在很短的时间内完成,几乎没有阻塞时间(等待I/O的时间),而CPU一直有大量运算要处理,因此CPU负载长期过高,例如,图像处理、训练算法模型等场景下会产生大量的CPU密集型任务。IO密集型与CPU密集型恰恰相反,一般是指服务器CPU的性能相对硬盘、内存硬件好很多,或者使用率低很多,系统运行多是CPU在等I/O(硬盘/内存)的读写操作,此类情景下CPU负载并不高,例如,文件读写、DB读写、网络请求等场景下会产生大量的IO密集型任务。
具体地,基于任务类型的不同,在使用线程池对这些任务进行处理时,基于对系统资源充分利用的目的,需要采用不同参数的线程池对不同任务类型的任务进行处理,因此,首先需要确认好待处理任务的任务类型,以方便后续选择合适的线程池。
进一步的,为了保证能够准确识别待处理任务的类型,在确认待处理任务对应的任务类型之前,还包括:
获取用户预先为系统中每个应用打上的任务类型标签,任务类型标签表征每个应用产生的任务对应的任务类型。
具体地,当用户在运行相关应用时,根据应用的实际情况,预先为应用打上相应的任务类型标签,对于会产生大量CPU密集型任务的应用打上CPU密集型标签,从而当该应用生成待处理任务时,使得其生成的待处理任务带上该CPU密集型标签,对于会产生打IO密集型任务的应用则打上IO密集型标签。
步骤S202:判断是否存在与任务类型对应的初始线程池。若存在,则执行步骤S203;若不存在,则执行步骤S204。
具体地,当确认待处理任务的任务类型之后,再确认是否存在适合处理该任务类型的线程池,例如,CPU密集型的任务适合采用核心线程数和CPU核心数相同的线程池进行处理,而IO密集型的任务则适合采用核心线程数为CPU核心数两倍的线程池进行处理,以达到充分利用系统资源的目的。进一步的,为了达到任务类型与线程池对应的目的,在创建初始线程池时,根据创建初始线程池时的核心线程数为初始线程池打上标签,例如,当初始线程池的核心线程数与CPU核心数相同,则将初始线程池打上CPU密集型标签,当初始线程池的核心线程数为CPU核心数的两倍时,则将初始线程池打上IO密集型标签,从而,在确认是否存在与任务类型对应的初始线程池时,只需要将任务类型与初始线程池的标签进行匹配即可获知。
步骤S203:将待处理任务分配至对应的初始线程池进行处理,并记录总耗时。
具体地,当存在与待处理任务的任务类型对应的初始线程池时,则将该待处理任务分配至对应的初始线程池进行处理,然后记录该待处理任务被处理时的总耗时。
步骤S204:获取系统性能参数,并根据系统性能参数和任务类型创建初始线程池,并将待处理任务分配至初始线程池处理并记录总耗时。
具体地,当不存在与该待处理任务的任务类型对应的初始线程池时,则根据系统性能参数,结合该待处理任务的任务类型创建一个对应的初始线程池,再利用该创建好的初始线程池处理该待处理任务,并记录总耗时。
进一步的,本实施例中,根据系统性能参数和任务类型创建初始线程池,包括:
1、获取系统的CPU核心数。
其中,CPU即中央处理器,是电脑中一个最重要、最核心的硬件。CPU主要的工作就是处理和运算数据,因此,CPU运算速度、主频、缓存、核心数决定了CPU的好坏,CPU的主频越高、缓存越大、核心数越多,CPU的运转速度就越快。CPU核心数指的是CPU内核数量,表示一个CPU由多少个核心组成,是CPU最重要的组成部分。常见的CPU核数有双核、四核、六核、八核、十二核等。在内核频率、缓存大小等条件相同的情况下,CPU内核数量越多,CPU的整体性能越强。比如3.8GHz的6核CPU就比3.8GHz的双核CPU性能要强。
2、根据任务类型和CPU核心数设置初始线程核心数,当任务类型为CPU密集型时,初始线程核心数与CPU核心数相同,当任务类型为IO密集型时,初始线程核心数为CPU核心数的二倍。
具体地,当任务类型为CPU密集型时,其需要利用CPU进行大量的计算处理,因此,CPU占用较高,为了能够确保CPU充分利用而线程池又不会明显阻塞,则可将初始线程池的初始核心线程数设置与CPU核心数相同,既能保证所有的CPU核心被利用到,又不会导致线程池的任务队列阻塞过长。当任务类型为IO密集型时,为了提高对CPU核心数的利用率,将初始线程池的初始线程核心数设置为CPU核心数的两倍,以提高对CPU核心数的利用率,避免CPU核心数执行完所有任务的计算操作后,还需要等待IO操作完成。
3、根据预先获取的用户配置参数设置最大线程数、线程空闲时间和任务阻塞队列长度。
需要理解的是,线程池通常包括七大核心参数,分别是:核心线程数、最大线程数、线程空闲时间、空闲线程保留时间的单位、任务阻塞队列长度、线程工程和拒绝策略,其中,线程工程和拒绝策略默认设置,核心线程数、最大线程数、线程空闲时间、空闲线程保留时间的单位、任务阻塞队列长度预先设置。本实施例中,核心线程数根据任务类型和CPU核心数设置,最大线程数、线程空闲时间和任务阻塞队列长度根据用于预先设定的配置参数设置,线程空闲时间还需根据预先设定的配置参数对应设置空闲线程保留时间的单位。
4、根据初始线程核心数、最大线程数、线程空闲时间和任务阻塞队列长度创建初始线程池。
具体地,在得到创建线程池的参数后,根据参数创建得到初始线程池。
步骤S103:当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数。
具体地,在得到总耗时之后,基于预设条件,结合该总耗时和预设期望耗时之间的关系确认初始线程池是否适合处理当前类型的任务,若不适合,则说明需要调整线程池的参数,以创建更适合处理当前任务的线程池,从而结合初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数。
进一步的,请参阅图3,该步骤S103具体包括:
步骤S301:判断待处理任务是CPU密集型任务还是IO密集型任务。
具体地,待处理任务的任务类型基于预先为应用打上的标签确定。
步骤S302:当待处理任务是IO密集型任务时,根据总耗时获取待处理任务被处理时的IO读取时间、CPU计算时间。
需要理解的是,待处理任务在被处理时,通常包括两个阶段,一个是CPU处理时的计算阶段,一个是IO操作阶段,因此,待处理任务被处理时,其总耗时包括CPU计算时间和IO读取时间。
步骤S303:当总耗时大于预设期望耗时时,确认IO读取时间与CPU计算时间的大小关系。
具体地,对于IO密集型任务而言,当总耗时大于预设期望耗时时,说明该任务的处理时间过长,系统资源的利用不合理,需要对线程池的参数进行调整;当总耗时小于或等于预设期望耗时时,说明此时线程池的参数配置合理,不需要进行调整。而当线程池的参数需要进行调整时,则可以IO读取时间和CPU计算时间之间的大小关系来选取对应的调整方式。
步骤S304:当IO读取时间大于等于CPU计算时间时,根据当前核心线程数和第一预设规则计算得到第一核心线程数,第一核心线程数多于当前核心线程数。
具体地,当IO读取时间大于等于CPU计算时间时,说明CPU提前完成了一个任务的计算操作这一阶段,在等待IO操作这一阶段的完成,此时,为了提高CPU的利用率,则可增加核心线程数,因此,通过结合初始线程池的当前核心线程数和第一预设规则计算得到大于当前核心线程数的第一核心线程数。
进一步的,第一预设规则包括:
第一核心线程数=(当前核心线程数+1)*125/100。
步骤S305:当IO读取时间小于CPU计算时间时,根据当前核心线程数和第二预设规则计算得到第二核心线程数,第二核心线程数少于当前核心线程数。
具体地,当IO读取时间小于CPU计算时间时,说明此时上下文切换较多,性能损耗较大,则需要减少核心线程数,以降低性能损耗,因此,通过初始线程池的当前核心线程数和第二预设规则计算得到小于当前核心线程数的第二核心线程数。
进一步的,第二预设规则包括:
第二核心线程数=当前核心线程数*75/100+1。
需要说明的是,上下文切换(有时也称做进程切换或任务切换)是指CPU从一个进程或线程切换到另一个进程或线程。进程(有时候也称做任务)是指一个程序运行的实例。在Linux系统中,线程就是能并行运行并且与他们的父进程(创建他们的进程)共享同一地址空间(一段内存区域)和其他资源的轻量级的进程。上下文是指某一时间点CPU寄存器和程序计数器的内容。寄存器是CPU内部的数量较少但是速度很快的内存(与之对应的是CPU外部相对较慢的RAM主内存)。寄存器通过对常用值(通常是运算的中间值)的快速访问来提高计算机程序运行的速度。程序计数器是一个专用的寄存器,用于表明指令序列中CPU正在执行的位置,存的值为正在执行的指令的位置或者下一个将要被执行的指令的位置,具体依赖于特定的系统。上下文切换可以认为是内核(操作系统的核心)在CPU上对于进程(包括线程)进行以下的活动:1、挂起一个进程,将这个进程在CPU中的状态(上下文)存储于内存中的某处。2、在内存中检索下一个进程的上下文并将其在CPU的寄存器中恢复。3、计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。所以,上下文切换对系统来说意味着消耗大量的CPU时间,事实上,可能是操作系统中时间消耗最大的操作。因此,在计算密集型操作较多时,应当减少核心线程数,从而降低性能损耗。
步骤S306:基于第一核心线程数或第二核心线程数,结合预先获取的用户配置参数生成新的线程池参数,新的线程池参数包括第一核心线程数或第二核心线程数、最大线程数、线程空闲时间和任务阻塞队列长度。
具体地,当IO读取时间大于等于CPU计算时间时,则计算得到第一核心线程数,再结合最大线程数、线程空闲时间和任务阻塞队列长度生成新的线程池参数以创建新的线程池。当IO读取时间小于CPU计算时间时,则计算得到第二核心线程数,再结合最大线程数、线程空闲时间和任务阻塞队列长度生成新的线程池参数以创建新的线程池。
需要说明的是,本实施例中,当待处理任务是CPU密集型任务时,核心线程数为服务器CPU核心数量,任务的上下文切换带来的性能损耗低,因此不需要对初始线程池的参数进行调整。
步骤S104:根据新的线程池参数创建新的线程池,并将后续任务分配至新的线程池进行处理。
具体地,在得到新的线程池参数后,创建新的线程池,并将后续的任务均分配至新的线程池进行处理。
需要理解的是,在将后续的任务分配到新的线程池进行处理的同时,仍需继续对任务的总耗时和预设期望耗时进行对比判断,并在再次满足预设条件时对线程池的参数进行调整,以保证线程池始终的性能最佳,提高对系统资源的利用率。
进一步的,将后续任务分配至新的线程池进行处理之后,还包括:
当初始线程池和新的线程池均用于同一任务类型的任务时,在初始线程池每个线程处理完正在执行的任务后,删除初始线程池。
具体地,当生成新的线程池参数,并根据新的线程池参数创建新的线程池之后,利用新的线程池处理后续任务,然后,等待初始线程池将已经在执行的任务处理完成,再把初始线程池删除,从而避免因创建过多的线程池而占用过多资源。
本发明实施例的线程池动态创建方法通过利用初始线程池对任务进行处理,记录处理任务的总耗时,再结合初始线程池的核心线程数、总耗时和预设期望耗时生成新的线程池参数,最后根据新的线程池参数创建新的线程池并利用新的线程池处理后续任务,当某一业务产生大量同类型的任务时,根据初次执行该类型任务的情况及时调整线程池参数并构建新的线程池,以使得新的线程池能够更为合理的执行该业务产生的所有任务,其结合任务的实际情况对线程池参数进行合理的设置,大大提升了对系统资源利用的合理性以及任务执行的效率。
图4是本发明实施例的线程池动态创建装置的功能模块示意图。如图4所示,该线程池动态创建装置40包括接收模块41、记录模块42、生成模块43和创建模块44。
接收模块41,用于接收待处理任务;
记录模块42,用于将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时,初始线程池包括已创建的初始线程池或新创建的初始线程池;
生成模块43,用于当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数;
创建模块44,用于根据新的线程池参数创建新的线程池,并将后续任务分配至新的线程池进行处理。
可选地,生成模块43执行当满足预设条件时,根据初始线程池的当前核心线程数、总耗时和预设期望耗时生成新的线程池参数的操作,具体包括:判断待处理任务是CPU密集型任务还是IO密集型任务;当待处理任务是IO密集型任务时,根据总耗时获取待处理任务被处理时的IO读取时间、CPU计算时间;当总耗时大于预设期望耗时时,确认IO读取时间与CPU计算时间的大小关系;当IO读取时间大于等于CPU计算时间时,根据当前核心线程数和第一预设规则计算得到第一核心线程数,第一核心线程数多于当前核心线程数;当IO读取时间小于CPU计算时间时,根据当前核心线程数和第二预设规则计算得到第二核心线程数,第二核心线程数少于当前核心线程数;基于第一核心线程数或第二核心线程数,结合预先获取的用户配置参数生成新的线程池参数,新的线程池参数包括第一核心线程数或第二核心线程数、最大线程数、线程空闲时间和任务阻塞队列长度。
可选地,第一预设规则包括:第一核心线程数=(当前核心线程数+1)*125/100;第二预设规则包括:第二核心线程数=当前核心线程数*75/100+1。
可选地,记录模块42执行将待处理任务分配至初始线程池进行处理,并记录处理待处理任务的总耗时的操作,具体包括:确认待处理任务对应的任务类型,任务类型包括CPU密集型和IO密集型;判断是否存在与任务类型对应的初始线程池;若存在,则将待处理任务分配至对应的初始线程池进行处理,并记录总耗时;若不存在,则获取系统性能参数,并根据系统性能参数和任务类型创建初始线程池,并将待处理任务分配至初始线程池处理并记录总耗时。
可选地,记录模块42执行根据系统性能参数和任务类型创建初始线程池的操作,具体包括:获取系统的CPU核心数;根据任务类型和CPU核心数设置初始线程核心数,当任务类型为CPU密集型时,初始线程核心数与CPU核心数相同,当任务类型为IO密集型时,初始线程核心数为CPU核心数的二倍;根据预先获取的用户配置参数设置最大线程数、线程空闲时间和任务阻塞队列长度;根据初始线程核心数、最大线程数、线程空闲时间和任务阻塞队列长度创建初始线程池。
可选地,记录模块42执行确认待处理任务对应的任务类型的操作之前,还用于:获取用户预先为系统中每个应用打上的任务类型标签,任务类型标签表征每个应用产生的任务对应的任务类型。
可选地,创建模块44执行将后续任务分配至新的线程池进行处理的操作之后,还用于:当初始线程池和新的线程池均用于同一任务类型的任务时,在初始线程池每个线程处理完正在执行的任务后,删除初始线程池。
关于上述实施例线程池动态创建装置中各模块实现技术方案的其他细节,可参见上述实施例中的线程池动态创建方法中的描述,此处不再赘述。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
请参阅图5,图5为本发明实施例的计算机设备的结构示意图。如图5所示,该计算机设备50包括处理器51及和处理器51耦接的存储器52,存储器52中存储有程序指令,程序指令被处理器51执行时,使得处理器51执行上述任一实施例所述的线程池动态创建方法的步骤。
其中,处理器51还可以称为CPU(Central Processing Unit,中央处理单元)。处理器51可能是一种集成电路芯片,具有信号的处理能力。处理器51还可以是通用处理器、数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
参阅图6,图6为本发明实施例的存储介质的结构示意图。本发明实施例的存储介质存储有能够实现上述所有方法的程序指令61,其中,该程序指令61可以以软件产品的形式存储在上述存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施方式所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质,或者是计算机、服务器、手机、平板等计算机设备设备。
在本申请所提供的几个实施例中,应该理解到,所揭露的计算机设备,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。以上仅为本申请的实施方式,并非因此限制本申请的专利范围,凡是利用本申请说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本申请的专利保护范围内。
Claims (10)
1.一种线程池动态创建方法,其特征在于,包括:
接收待处理任务;
将所述待处理任务分配至初始线程池进行处理,并记录处理所述待处理任务的总耗时,所述初始线程池包括已创建的初始线程池或新创建的初始线程池;
当满足预设条件时,根据所述初始线程池的当前核心线程数、所述总耗时和预设期望耗时生成新的线程池参数;
根据所述新的线程池参数创建新的线程池,并将后续任务分配至所述新的线程池进行处理。
2.根据权要求1所述的线程池动态创建方法,其特征在于,所述当满足预设条件时,根据所述初始线程池的当前核心线程数、所述总耗时和预设期望耗时生成新的线程池参数,包括:
判断所述待处理任务是CPU密集型任务还是IO密集型任务;
当所述待处理任务是IO密集型任务时,根据所述总耗时获取所述待处理任务被处理时的IO读取时间、CPU计算时间;
当所述总耗时大于所述预设期望耗时时,确认所述IO读取时间与所述CPU计算时间的大小关系;
当所述IO读取时间大于等于所述CPU计算时间时,根据所述当前核心线程数和第一预设规则计算得到第一核心线程数,所述第一核心线程数多于所述当前核心线程数;
当所述IO读取时间小于所述CPU计算时间时,根据所述当前核心线程数和第二预设规则计算得到第二核心线程数,所述第二核心线程数少于所述当前核心线程数;
基于所述第一核心线程数或所述第二核心线程数,结合预先获取的用户配置参数生成新的线程池参数,所述新的线程池参数包括所述第一核心线程数或所述第二核心线程数、最大线程数、线程空闲时间和任务阻塞队列长度。
3.根据权利要求2所述的线程池动态创建方法,其特征在于,所述第一预设规则包括:
所述第一核心线程数=(所述当前核心线程数+1)*125/100;
所述第二预设规则包括:
所述第二核心线程数=所述当前核心线程数*75/100+1。
4.根据权要求1所述的线程池动态创建方法,其特征在于,所述将所述待处理任务分配至初始线程池进行处理,并记录处理所述待处理任务的总耗时,包括:
确认所述待处理任务对应的任务类型,所述任务类型包括CPU密集型和IO密集型;
判断是否存在与所述任务类型对应的所述初始线程池;
若存在,则将所述待处理任务分配至对应的所述初始线程池进行处理,并记录所述总耗时;
若不存在,则获取系统性能参数,并根据所述系统性能参数和所述任务类型创建所述初始线程池,并将所述待处理任务分配至所述初始线程池处理并记录所述总耗时。
5.根据权要求4所述的线程池动态创建方法,其特征在于,所述根据所述系统性能参数和所述任务类型创建所述初始线程池,包括:
获取系统的CPU核心数;
根据所述任务类型和所述CPU核心数设置初始线程核心数,当所述任务类型为所述CPU密集型时,所述初始线程核心数与所述CPU核心数相同,当所述任务类型为所述IO密集型时,所述初始线程核心数为所述CPU核心数的二倍;
根据预先获取的用户配置参数设置最大线程数、线程空闲时间和任务阻塞队列长度;
根据所述初始线程核心数、所述最大线程数、所述线程空闲时间和所述任务阻塞队列长度创建所述初始线程池。
6.根据权要求4所述的线程池动态创建方法,其特征在于,所述确认所述待处理任务对应的任务类型之前,还包括:
获取用户预先为系统中每个应用打上的任务类型标签,所述任务类型标签表征每个应用产生的任务对应的任务类型。
7.根据权要求4所述的线程池动态创建方法,其特征在于,所述将后续任务分配至所述新的线程池进行处理之后,还包括:
当所述初始线程池和所述新的线程池均用于同一任务类型的任务时,在所述初始线程池每个线程处理完正在执行的任务后,删除所述初始线程池。
8.一种线程池动态创建装置,其特征在于,包括:
接收模块,用于接收待处理任务;
记录模块,用于将所述待处理任务分配至初始线程池进行处理,并记录处理所述待处理任务的总耗时,所述初始线程池包括已创建的初始线程池或新创建的初始线程池;
生成模块,用于当满足预设条件时,根据所述初始线程池的当前核心线程数、所述总耗时和预设期望耗时生成新的线程池参数;
创建模块,用于根据所述新的线程池参数创建新的线程池,并将后续任务分配至所述新的线程池进行处理。
9.一种计算机设备,其特征在于,所述计算机设备包括处理器、与所述处理器耦接的存储器,所述存储器中存储有程序指令,所述程序指令被所述处理器执行时,使得所述处理器执行如权利要求1-7中任一项权利要求所述的线程池动态创建方法的步骤。
10.一种存储介质,其特征在于,存储有能够实现如权利要求1-7中任一项所述的线程池动态创建方法的程序指令。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210937120.9A CN115269196A (zh) | 2022-08-05 | 2022-08-05 | 线程池动态创建方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210937120.9A CN115269196A (zh) | 2022-08-05 | 2022-08-05 | 线程池动态创建方法、装置、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115269196A true CN115269196A (zh) | 2022-11-01 |
Family
ID=83748245
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210937120.9A Pending CN115269196A (zh) | 2022-08-05 | 2022-08-05 | 线程池动态创建方法、装置、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115269196A (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115794449A (zh) * | 2023-02-10 | 2023-03-14 | 中科源码(成都)服务机器人研究院有限公司 | 动态线程池构建方法、远程过程调用方法及装置 |
CN116755869A (zh) * | 2023-08-23 | 2023-09-15 | 北京浩然五洲软件技术有限公司 | 一种金融业务进件处理方法、系统和介质 |
CN117193992A (zh) * | 2023-11-08 | 2023-12-08 | 浙江大华技术股份有限公司 | 模型训练方法、任务调度方法、装置以及计算机存储介质 |
CN117294347A (zh) * | 2023-11-24 | 2023-12-26 | 成都本原星通科技有限公司 | 一种卫星信号接收处理方法 |
-
2022
- 2022-08-05 CN CN202210937120.9A patent/CN115269196A/zh active Pending
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115794449A (zh) * | 2023-02-10 | 2023-03-14 | 中科源码(成都)服务机器人研究院有限公司 | 动态线程池构建方法、远程过程调用方法及装置 |
CN115794449B (zh) * | 2023-02-10 | 2023-10-03 | 中科源码(成都)服务机器人研究院有限公司 | 动态线程池构建方法、远程过程调用方法及装置 |
CN116755869A (zh) * | 2023-08-23 | 2023-09-15 | 北京浩然五洲软件技术有限公司 | 一种金融业务进件处理方法、系统和介质 |
CN116755869B (zh) * | 2023-08-23 | 2023-10-27 | 北京浩然五洲软件技术有限公司 | 一种金融业务进件处理方法、系统和介质 |
CN117193992A (zh) * | 2023-11-08 | 2023-12-08 | 浙江大华技术股份有限公司 | 模型训练方法、任务调度方法、装置以及计算机存储介质 |
CN117193992B (zh) * | 2023-11-08 | 2024-02-02 | 浙江大华技术股份有限公司 | 模型训练方法、任务调度方法、装置以及计算机存储介质 |
CN117294347A (zh) * | 2023-11-24 | 2023-12-26 | 成都本原星通科技有限公司 | 一种卫星信号接收处理方法 |
CN117294347B (zh) * | 2023-11-24 | 2024-01-30 | 成都本原星通科技有限公司 | 一种卫星信号接收处理方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN115269196A (zh) | 线程池动态创建方法、装置、设备及存储介质 | |
US9032417B2 (en) | Information processing apparatus and information processing apparatus control method | |
JP6800850B2 (ja) | 中央処理装置(cpu)と補助プロセッサとの間の改善した関数コールバック機構 | |
US20110161978A1 (en) | Job allocation method and apparatus for a multi-core system | |
US20110161965A1 (en) | Job allocation method and apparatus for a multi-core processor | |
CN111078394B (zh) | 一种gpu线程负载均衡方法与装置 | |
JPWO2009150815A1 (ja) | マルチプロセッサシステム | |
WO2016202153A1 (zh) | 一种gpu资源的分配方法及系统 | |
WO2016202154A1 (zh) | 一种gpu资源的分配方法及系统 | |
EP1811375B1 (en) | Processor | |
US20140310723A1 (en) | Data processing apparatus, transmitting apparatus, transmission control method, scheduling method, and computer product | |
EP2630577B1 (en) | Exception control in a multiprocessor system | |
US20200012524A1 (en) | Processor and Instruction Scheduling Method | |
CN110716805A (zh) | 图形处理器的任务分配方法、装置、电子设备及存储介质 | |
US7603673B2 (en) | Method and system for reducing context switch times | |
CN115905040A (zh) | 计数器的处理方法、图形处理器、设备及存储介质 | |
CN115098230A (zh) | 管理线程的方法及装置 | |
CN115904644A (zh) | 任务调度方法、电子设备和计算机程序产品 | |
US9619277B2 (en) | Computer with plurality of processors sharing process queue, and process dispatch processing method | |
JP5668505B2 (ja) | クロック周波数制御プログラム、クロック周波数制御装置 | |
CN112631510A (zh) | 堆栈区域扩充的方法、装置及硬件平台 | |
CN107562527B (zh) | 一种rtos上的smp的实时任务调度方法 | |
JP5376042B2 (ja) | マルチコアプロセッサシステム、スレッド切り替え制御方法、およびスレッド切り替え制御プログラム | |
CN115794324A (zh) | 任务处理方法、装置及存储介质 | |
CN113032154B (zh) | 一种虚拟cpu的调度方法、装置、电子设备及存储介质 |
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 |