CN115794449A - 动态线程池构建方法、远程过程调用方法及装置 - Google Patents
动态线程池构建方法、远程过程调用方法及装置 Download PDFInfo
- Publication number
- CN115794449A CN115794449A CN202310094496.2A CN202310094496A CN115794449A CN 115794449 A CN115794449 A CN 115794449A CN 202310094496 A CN202310094496 A CN 202310094496A CN 115794449 A CN115794449 A CN 115794449A
- Authority
- CN
- China
- Prior art keywords
- thread
- thread pool
- threads
- starting
- remote procedure
- 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.)
- Granted
Links
Images
Landscapes
- Computer And Data Communications (AREA)
Abstract
本发明公开了一种动态线程池构建方法、远程过程调用方法及装置。服务端设备依据配置的启动参数,启动服务端程序,该启动参数指示在不同时间下线程池所包含的线程数量。服务端程序在启动后,持续监听客户端设备的RPC请求,在监听到RPC请求时,分配socket,并动态绑定线程池中的线程来处理该RPC请求的任务,之后将执行结果反馈给客户端设备。本发明将分配的socket与线程池中的线程进行绑定时,执行该线程的resume()函数,以快速调度线程。本发明能够避免频发地创建和释放线程,同时提高服务端程序的响应速度,并且能够保证线程池的大小持续处于较优的状态,高效利用了服务端程序的内存。
Description
技术领域
本发明涉及计算机通信领域,尤其是一种动态线程池构建方法,以及一种基于动态线程池的RPC(Remote Procedure Call,远程过程调用)方法及装置。
背景技术
通过RPC(Remote Procedure Call,远程过程调用),我们可以充分利用非共享内存的多处理器环境(例如通过局域网连接的多台应用服务器),这样可以简便地将你的应用分布在多台应用服务器上,应用程序就像运行在一个多处理器的计算机上一样。我们可以方便的实现过程代码共享,提高系统资源的利用率,也可以将以大量数值处理的操作放在处理能力较强的系统上运行,从而减轻前端机的负担。RPC作为普遍的C/S开发方法,开发效率高效、可靠。RPC方法的基本原则是:以模块调用的简单性忽略通讯的具体细节,以便程序员不用关心C/S之间的通讯协议,集中精力实现应用过程。
RPC需要兼具响应快、高并发两大性能。利用c/c++标准库函数写的RPC服务端程序既可以跨平台使用又可以提高程序的执行效率,当有客户端通过RPC发送请求时,RPC服务端程序就会监听到请求,响应请求然后分配socket的内存单元并初始化,创建一个线程以处理RPC请求的任务,在事件处理完成后该线程的生命周期便结束了。在传统的服务程序中,在我们要处理相关操作时创建一个线程,为这个线程的类分配内存空间并为该线程的运行分配栈空间,然后执行线程的run()函数为应用程序处理相关的事情,待事情处理完毕后,应用程序会关闭此线程并释放线程的所有资源,等到下次需要新的线程来响应应用程序的需求时再次创建线程分配资源。
然而,频繁的为RPC服务创建线程分配资源和关闭线程释放资源会大大增加CPU的开销,影响RPC的效率,严重的会使客户端RPC请求响应的实时性得不到保障,频繁的动态申请和释放内存也会增加内存碎片,并且可能还会有内存泄漏的风险。而针对该缺陷,人们想到了线程池的概念,即预先搭建包含某一数量线程的线程池,这些线程常驻内存,在需要处理RPC请求时,绑定某个线程处理任务事件,处理完成后,解除绑定,但不释放该线程的资源,该线程可以继续处理下一次RPC请求,以快速响应RPC请求,此类解决方案例如有文献CN106648940A所公开的一种远程过程调用方法及装置。
但是,上述构建线程池的方案的线程池容量是固定的,即无论活跃的客户端设备有多少,线程的数量是固定不变的,这在仅有少量活跃客户端设备(即RPC请求少)的情况下,会造成服务器设备内存资源的浪费。
发明内容
本发明的发明目的在于:针对上述存在的问题,提供一种动态线程池构建方法,以动态调整线程池中线程的数量,以在解决线程频繁创建和释放的问题的情况时,尽可能高效利用服务器设备的内存。
本发明采用的技术方案如下:
一种动态线程池构建方法,应用于服务器设备;所述方法包括:
接收配置的启动参数,依据所述启动参数启动服务端程序,启动服务端程序包括依据所述启动参数搭建线程池的过程;所述启动参数指示在不同时间下线程池所包含的线程数量。所谓的启动服务端程序,即从开启服务端程序到关闭前这期间的过程。
为解决上述全部或部分问题,本发明还提供了一种基于动态线程池的远程过程调用方法,该方法应用于服务器设备,所述服务器设备与客户端设备通信连接,所述方法包括:
接收配置的启动参数,所述启动参数指示在不同时间下线程池所包含的线程数量;
依据所述启动参数启动服务端程序,启动服务端程序包括依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池的过程;还包括:
监听客户端设备的远程过程调用请求;
响应监听到的远程过程调用请求,从线程池中选择线程以执行所述远程过程调用请求的任务;
将所述线程的执行结果反馈给所述客户端设备。
为解决上述全部或部分问题,本发明还提供了一种基于动态线程池的远程过程调用装置,应用于服务器设备,所述服务器设备与客户端设备通信连接,所述装置包括:
配置单元,用于接收配置的启动参数,所述启动参数指示在不同时间下线程池所包含的线程数量;
启动单元,用于依据所述启动参数启动服务端程序,包括依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池;
请求监听单元,用于监听客户端设备的远程过程调用请求;
任务执行单元,用于从线程池中选择线程执行所述请求监听单元所监听到的远程过程调用请求的任务,并将所述线程的执行结果反馈给所述客户端设备。
综上所述,由于采用了上述技术方案,本发明的有益效果是:
1、本发明能够避免频繁地创建和释放线程,能够避免因此造成的服务器设备资源浪费,同时能够提高服务端程序的响应速度。
2、本发明在保证服务端程序构建有线程池的情况下,依据时间动态调整线程池中的线程数量,以与活跃的客户端设备数量动态适配,既能保证对RPC请求的快速响应,又能保证对线程的高效利用,保证对服务端程序内存的高效利用。
附图说明
本发明将通过例子并参照附图的方式说明,其中:
图1是服务器设备和客户端设备之间RPC通信的网络构造示意图。
图2是基于动态线程池的RPC方法流程的一个优选实施例。
具体实施方式
本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互相排斥的特征和/或步骤以外,均可以以任何方式组合。
本说明书(包括任何附加权利要求、摘要)中公开的任一特征,除非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。
实施例一
本实施例公开了一种动态线程池构建方法,该方法应用与服务器设备,服务器设备即提供远程应用服务的设备,其响应客户端设备的RPC请求进行任务事件的处理,以及将处理结果反馈给客户端设备。
在本方法中,通过配置启动参数来对服务端程序进行启动指示。该启动参数包含指示服务端程序在不同时间下线程池所包含的线程数量的信息,服务端程序接收该启动参数,依据该启动参数的指示启动服务端程序,服务端程序启动过程涉及开启服务端程序到关闭服务端程序的过程,包含依据启动参数的指示搭建线程池,即依据启动参数中信息的指示,在不同的时间搭建包含相应数量线程的线程池。例如,启动参数指示在时间t1时(或t1-t2内),线程池中线程数量为n1,在时间t2时(或t2-t3内),线程池中线程数量为n2……在时间tk时(或tk-t1内),线程中线程数量为nk。对应的,服务端程序则在时间t1时,搭建包含n1个线程的线程池,在时间t2时,重新搭建包含n2个线程的线程池……在时间tk时,重新搭建包含nk个线程的线程池。由于时间是循环的,则在服务端程序未关闭前,在时间又到达t1时,服务端程序重新搭建包含n1个线程的线程池,以此循环。
线程池的搭建,为在服务端程序启动的时候动态创建了多个(线程的个数可以在服务端程序中配置)线程类CSocketThread的实例,并调用pThread->Start()分配线程的栈空间启动线程,这样使得线程池中的线程可以常驻内存。服务端程序启动后,已搭建的线程池中线程的数量不可直接调整,仅能重新搭建线程池,每一次重建则依据配置的线程数量初始化线程池,并且,一旦启动参数配置完成,则其指示的每个时间下的线程数量将固定,在服务端程序关闭前不可调整指示参数。
通常,在客户端设备规模达到一个相对稳定的状态时,在各时段活跃的客户端设备是趋于稳定的,通过统计学分析即可得到一个理想的活跃客户端数量在时间上的分布状况,依据该分布状况即可得到不同时间下需要的线程数量,确定几个时刻设置对应线程数量即可完成对启动参数中指示信息(指示不同时间下线程池所包含的线程数量的信息)的设定。选择的时刻的数量可以根据应用场景中活跃客户端设备数量变化频率高低进行确定,例如数量变化频繁的场景,则选择的时刻多一些,而数量变化不频繁的场景,选择的时刻少一些。
通常,重新搭建线程池的时间是通过定时器触发/定时器中断实现的,启动参数指示在相应时间(即配置的需要调整线程池中线程数量的不同时间下的各特定时间)启动定时器中断来配置该时间下线程池所包含的线程数量,服务端程序依据该指示,确定触发定时器中断的时间,以及在该时间要搭建的线程池中线程的数量,在到达定时器指示的时间时,执行定时器中断以依据设定好的线程数量搭建线程池。
实施例二
本实施例公开了一种基于动态线程池的RPC方法,其同样应用于服务器,该服务器与多个客户端设备通信连接,以响应客户端设备的RPC请求在本端执行请求的任务事件。
RPC方法包括:
接收配置的启动参数,该启动参数指示在不同时间下线程池所包含的线程数量,通过启动参数中的一个或多个指示信息进行指示。
服务端设备依据该启动参数的指示启动服务端程序,启动服务端程序包括依据启动参数的指示在不同时间搭建包含对应数量线程的线程池的过程。
在一种实现方式中,服务端程序在启动时,从时钟获取当前时间,对照启动参数的指示获取当前时间对应的线程数量,依据该指示的数量,搭建包含相应数量线程的线程池。之后获取启动参数指示的需要调整线程池中线程数量的下一时刻,依据该指示设定下一时刻的定时器中断;监听时钟,在到达所述下一时刻时,执行定时器中断,以依据启动参数指示的在该下一时刻的线程数量重新搭建线程池。通常,需要调整线程池中线程数量的时刻不止一个,因此,在启动服务器第一次搭建线程池后,可以循环执行设定下一时刻的定时器中断以及在定时器中断时间到达时重新搭建线程池的过程。
客户端设备活跃具有周期性,即在某一天的活跃状态通常会保留到下一天,或者某一周的活跃状态与上一周的活跃状态相同。因此,重新搭建线程池的时刻通常能回到之前重建线程池的时刻(如启动服务端程序在某一天的A时刻,在该天的B时刻第一次重建了线程池,在第二天的A时刻或B时刻及之后,遵循前一天的规律来重建线程池)。
在技术实现上,还有另一种在不同时间调整线程池中线程数量的方法。该方法在启动服务端程序后即依据时间循环执行某一流程,直至退出服务端程序。该循环的流程包括:
监听时钟获得当前时间,依据启动参数的指示,获得当前时间对应的线程数量,搭建包含该数量的线程的线程池;以及
依据启动参数的指示,获得需要调整线程池中线程数量的下一时刻,设定在该时刻启动定时器中断,该定时器中断的响应动作为重新依据启动参数指示的线程数量搭建线程池,则设定的定时器中断则指示在到达下一时刻时重新搭建包含所述启动参数指示的数量的线程的线程池。
在第一次循环里,先搭建当前时刻的线程池,线程数量依据启动参数的指示进行设定,然后设定下一时刻的定时器中断。在该下一时刻定时器中断触发时,则启动下一次循环,依据启动参数的指示,搭建包含对应下一时刻数量的线程的线程池,然后再设定之后时刻的定时器中断,以此类推。
无论是何种实现方式,只要其在启动服务端程序后,依据配置的启动参数的指示多次搭建了线程池,并且线程池的数量在至少一个时刻发生了变化,则均未脱离本发明的构思。
在启动服务端程序过程中,即服务端程序启动(开启)状态下,监听客户端设备的RPC请求。
前文说道,服务器设备接入有多个客户端设备,服务端程序为活跃的客户端设备提供远程过程调用服务。客户端设备可以是PC电脑、手持终端、机器人等接入设备,客户端设备与服务器设备之间的RPC通信网络结构如图1所示。服务器设备除提供RPC服务程序外,根据业务需要还可部署MQTT、WebSocket、Http、数据库等服务程序。例如在部署RPC的同时部署数据库服务,便可以将某些RPC接收到的重要数据存储于数据库中。当然,这与本发明的主要发明点无关,仅属于其他方向的可改进点。
客户端设备的客户端程序启动,执行main()函数,通过调用StartServer开启服务,在StartServer中会实例化一个CRPCServer类型的对象并初始化,CRPCServer继承自三个父类,类声明如下:
class CRPCServer : public TCPServer, publicCMyThread, ThreadPool
其中CMyThread类为线程类,CRPCServer对它的run()函数进行了重写CRPCServer::Run(),将该线程作为监听客户端请求的主线程,在该主线程的初始化阶段会根据启动参数的指示设置定时器(执行定时器中断),并调用InitPool()函数依据启动参数指示的线程数量初始化线程池。
在监听到客户端设备的RPC请求时,响应该RPC请求,从线程池中选择线程以执行所述远程过程调用请求的任务,并最终将该线程的执行结果反馈给对应的客户端设备。
对于RPC请求的响应与现有技术类似,在监听到客户端设备的RPC请求时,先解析该RPC请求获得需要执行的读/写任务,然后从线程池中选择线程来执行该任务,并将执行结果反馈给客户端设备。
举个例子,服务机器人(客户端设备)控制器可以使用RPC框架向云端(服务器设备)发送路径规划、定位导航和人工智能的计算请求(RPC请求),云端依赖其强大的运算能力将计算结果通过RPC反馈给机器人端。这样能够很好地解决机器人算力有限的缺点,增加了机器人的智能性。该服务机器人可以为例如送餐机器人、搬运机器人、物流机器人等。
以送餐机器人为例,根据统计,餐厅在00:00-08:00时间段不营业,在08:00-11:00时间段有少量人用餐,在11:00-14:00时间段为用餐高峰,顾客最多,在14:00-16:30时间段用餐人较少,在16:30-22:00用餐人再次增多,在22:00-24:00有零星用餐顾客。则对应的,用于派餐的送餐机器人在这些不同的时段的活跃状态有所不同,在用餐高峰时段,需要较多的送餐机器人送餐,则并发的RPC请求多,而在用餐人员较少时,则只有少量送餐机器人在工作,则并发的RPC请求少。依据此对不同时间段的时刻以及每个时间段内工作的送餐机器人极值的统计,对服务端程序进行相应配置。在服务端程序启动前,在启动参数中,利用一个指示信息来指示需要调整线程池中线程数量的时刻(如上述的00:00、08:00、11:00、14:00、16:30、22:00),以及每个时刻需要的线程数量(对应RPC并发请求数量),将该启动参数配置到服务器设备,服务端程序则在该启动参数的指示下,在相应的时刻对线程池进行重检。
需要说明的是,提前配置好不同时段中线程池的线程数量,是出于对服务端程序内存的高效利用,保证线程池中线程数量的配置处于一个较优的状态,但并不能保证线程池中线程刚好与RPC请求数相同,绝大多数情况下,并发的RPC请求数会少于对应时刻线程池中的线程数量,但与总线程数量差异不会很大,另外,RPC请求数也可能超过对应时刻线程池中的线程数量,对此种情况,超出的RPC请求部分,则通过传统的方式,临时创建对应数量的线程来对这超出的RPC请求部分进行处理,处理结束后释放此部分线程。每个时段的时刻以及各时间段所设置的线程数量可以在关闭服务端程序后进行更新,例如出现RPC请求超出对应时刻线程池中线程数量的情况过多时,则表明当前该时间段配置的线程数量难以满足实际需求,可以将启动参数中该时间段的线程数量设置得更大些后,再重新启动服务端程序,而对于时刻的调整同理。
服务端程序对RPC请求的响应,是在监听到RPC请求时,分配socket(套接字)的内存单元并初始化,然后将分配的socket与线程池中的线程进行动态绑定,使用所绑定的线程处理RPC请求的任务。
线程池中的线程常驻内存,在为RPC请求分配socket后,将空闲的线程与socket进行绑定,该线程执行RPC请求的任务,之后解除该线程与socket的绑定,释放该socket的内存空间,而保留该线程的内存空间,而该线程还可以在之后绑定为其他RPC请求分配的socket。即线程池中的一个线程可以先后处理多个不同的客户端发来的RPC请求,避免了线程频繁申请释放的开销,提高了服务端程序并发响应的效率。
上述socket绑定的线程,为线程池中处于空闲状态的线程,对于线程的状态,可通过标记其空闲或者忙碌来辨识。作为本发明的一个设计要点,在初始化线程池(即搭建线程池)时,将线程池中的线程均标记为空闲状态,在需要将线程绑定到socket时,遍历线程池中的线程,将遍历到的第一个空闲状态的线程与socket进行绑定,同时标记该线程为忙碌状态,该线程则执行RPC请求的任务,执行完毕后,关闭socket(即接触了与线程的绑定),释放socket的内存空间,将线程标记回空闲状态。
如图2所示为在具体实施过程中搭建线程池以及响应RPC请求的一个实例:
首先根据配置好的启动参数启动服务端程序,创建CRPCServer对象。
根据启动参数的指示判断当前时间线程池中线程的数量,并设置定时器,当定时器触发时动态设置线程池。设置的定时器所指示的时间和线程数量(即线程池大小)根据启动参数的指示进行配置。对于每一次调整(启动服务端程序时或者定时器触发时),调用InitPool对线程池进行初始化,根据启动参数指示的当前时间的线程数量,分配或者释放线程的空间。之后对线程池中的各线程建立指针数组m_plpThread[],并将各线程标记为idle状态(即空闲状态)。
在服务端程序启动状态,持续监听客户端设备的RPC请求。
在监听到RPC请求后,调用OnAccept响应,初始化一个与客户端设备建立连接的socket。
遍历m_plpThread[]数组里的线程。
判断所遍历到的线程是否为idle状态的线程,若是,则将该线程标记为Thread_Busy状态,调用pThread->SetNewSocket(psock)将上述连接的socket与该线程进行绑定。否则,继续遍历m_plpThread[]数组里的线程,或者在遍历所有线程后均没有发现idle状态的线程,则创建一个新线程。这样,服务端设备在处理RPC请求时,不局限于某一个线程去处理数据的发送和接收,对socket的处理对于服务端的idle线程都可以处理,谁空闲谁响应快谁来处理。从而提高服务端程序对单个RPC请求的响应速度。
该线程被resume,执行CSocketThread::Run()函数。执行m_pSocket->OnReceive()接收客户端设备发来的数据。
服务端设备处理完接收到的数据后,调用m_plRpcServer->OnRequest()发送接收数据通知给客户端设备。
CSocketThread::Run()被多次调用过程中,执行CSockWrap::Recv()。
判断任务是否处理完毕。即判断(-1==rt.nresult||10054==rt.nresult||10053==rt.nresult),若判断结果为处理完毕(为真),则关闭socket,释放socket的内存空间,否则跳转到接收客户端设备发来的数据的步骤。
前文说过,在线程池中的线程难以满足并发RPC请求时,会新建传统的线程来处理该RPC请求。因此,在关闭socket后,还要判断所绑定的线程是否在线程池中。若是,则解除该线程与socket的绑定,置该线程为idle状态;否则关闭该线程,调用delete释放掉该线程的内存资源。
此外,本发明的另一个设计要点在于,在对线程池中的线程进行调度时,在操作系统自动调度(即顺序遍历线程)的基础上增加了事件调度机制,以在应对RPC请求时使处理该任务事件的线程得到快速调度,增加服务器设备对客户端设备RPC请求的响应速度。在一些实施例中,当socket与线程池中的线程进行(动态)绑定时,执行该线程的resume()函数,resume()函数会调用wake_up()函数,让绑定socket的该线程由睡眠状态转变为就绪状态,等待CPU的调度,这样让该线程能得到快速调度。
本实施例中RPC方法的设计,在实际中,是以RPC装置作为实现载体,即本实施例中的部分或全部设计逻辑,在不违反自然规律的情况下,可以应用于下文实施例三的RPC装置中。
实施例三
本实施例公开了一种基于动态线程池的远程过程调用装置,该装置应用与服务器设备,该服务器设备与客户端设备通信连接,所述装置包括配置单元、启动单元、请求监听单元和任务执行单元。
配置单元,用于接收配置的启动参数,所述启动参数指示在不同时间下线程池所包含的线程数量。启动参数通过一个或多个指示信息来实现对不同时间及对应线程池大小(即所包含的线程的数量)的指示。需要调整的时刻以及相应的线程数量根据应用场景的需求进行配置,每一次启动服务端程序前均可进行更新,包括对时间以及线程数量的更新。
启动单元,用于依据所述启动参数启动服务端程序,包括依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池。
启动单元包括定时器,启动单元依据启动参数的指示设定所述定时器,包括设定定时器的时间以及相应时间下线程池的线程数量;启动单元响应于到达所述定时器的计时时间,搭建包含该时间对应数量线程的线程池。
在一些实施方式中,启动单元启动服务端程序时,从时钟获取当前时间,对照启动参数的指示获取当前时间对应的线程数量,依据该指示的数量,搭建包含相应数量线程的线程池。之后获取启动参数指示的需要调整线程池中线程数量的下一时刻,依据该指示设定下一时刻的定时器中断;监听时钟,在到达所述下一时刻时,执行定时器中断,以依据启动参数指示的在该下一时刻的线程数量重新搭建线程池。在启动服务器第一次搭建线程池后,启动到哪元可以循环执行设定下一时刻的定时器中断以及在定时器中断时间到达时重新搭建线程池的过程。
还有一种实施方式,即在启动服务端程序后,直接循环以下操作直至退出服务端程序:
监听时钟获得当前时间,依据启动参数的指示,获得当前时间对应的线程数量,搭建包含该数量的线程的线程池。以及依据启动参数的指示,获得需要调整线程池中线程数量的下一时刻,设定在该时刻启动定时器中断,该定时器中断的响应动作为重新依据启动参数指示的线程数量搭建线程池,则设定的定时器中断则指示在到达下一时刻时重新搭建包含所述启动参数指示的数量的线程的线程池。
无论是何种实现方式,只要启动单元在启动服务端程序后,依据配置的启动参数的指示多次搭建了线程池,并且线程池的数量在至少一个时刻发生了变化,则均未脱离本发明的构思。
请求监听单元,用于监听客户端设备的RPC请求。显然,是在启动服务端程序状态下进行的监听。
任务执行单元,用于从线程池中选择线程执行所述请求监听单元所监听到的远程过程调用请求的任务,并将所述线程的执行结果反馈给所述客户端设备。
任务执行单元对RPC请求的响应,是在请求监听单元监听到RPC请求时,分配socket(套接字)的内存单元并初始化,然后将分配的socket与启动单元所搭建的线程池中的线程进行动态绑定,使用所绑定的线程处理RPC请求的任务。
线程池中的线程常驻内存,任务执行单元在为RPC请求分配socket后,将空闲的线程与socket进行绑定,该线程执行RPC请求的任务,之后解除该线程与socket的绑定,释放该socket的内存空间,而保留该线程的内存空间,而该线程还可以在之后绑定为其他RPC请求分配的socket。即线程池中的一个线程可以先后处理多个不同的客户端发来的RPC请求,避免了线程频繁申请释放的开销,提高了服务端程序并发响应的效率。
作为本发明的一个设计要点,在启动单元初始化线程池(即搭建线程池)时,在初始化线程池(即搭建线程池)时,将线程池中的线程均标记为空闲状态,任务执行单元在将线程绑定到socket时,遍历线程池中的线程,将遍历到的第一个空闲状态的线程与socket进行绑定,如果没有空闲的线程,则新建一个线程进行帮当,标记该线程为忙碌状态,该线程则执行RPC请求的任务,执行完毕后,任务执行单元关闭socket(即接触了与线程的绑定),释放socket的内存空间,将线程标记回空闲状态。上述各单元之间通过相互配合,可以执行如图2所示的RPC流程。
本发明的另一个设计要点在于,任务执行单元在对线程池中的线程进行调度时,在操作系统自动调度(即顺序遍历线程)的基础上增加了事件调度机制,以在应对RPC请求时使处理该任务事件的线程得到快速调度,增加服务器设备对客户端设备RPC请求的响应速度。在一些实施例中,任务执行单元在将socket与线程池中的线程进行(动态)绑定时,执行该线程的resume()函数,resume()函数会调用wake_up()函数,让绑定socket的该线程由睡眠状态转变为就绪状态,等待CPU的调度,这样让该线程能得到快速调度。
本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何新的组合。
Claims (10)
1.一种动态线程池构建方法,应用于服务器设备;所述方法包括:
接收配置的启动参数,依据所述启动参数启动服务端程序,启动服务端程序包括依据所述启动参数搭建线程池的过程;其特征在于,
所述启动参数指示在不同时间下线程池所包含的线程数量。
2.如权利要求1所述的动态线程池构建方法,其特征在于,所述启动参数指示在所述不同时间下的各特定时间启动定时器中断来配置对应特定时间下线程池所包含的线程数量。
3.一种基于动态线程池的远程过程调用方法,应用于服务器设备,所述服务器设备与客户端设备通信连接,其特征在于,所述方法包括:
接收配置的启动参数,所述启动参数指示在不同时间下线程池所包含的线程数量;
依据所述启动参数启动服务端程序,启动服务端程序包括依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池的过程;还包括:
监听客户端设备的远程过程调用请求;
响应监听到的远程过程调用请求,从线程池中选择线程以执行所述远程过程调用请求的任务;
将所述线程的执行结果反馈给所述客户端设备。
4.如权利要求3所述的基于动态线程池的远程过程调用方法,其特征在于,所述依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池,包括:
依据所述启动参数的指示,搭建包含对应于当前时间的数量的线程的线程池,循环执行以下流程,直至服务端程序退出:
依据所述启动参数的指示,设定下一时刻的定时器中断;
在到达所述定时器中断指示的下一时刻时,执行定时器中断以依据所述启动参数指示的线程数量重新搭建线程池。
5.如权利要求3所述的基于动态线程池的远程过程调用方法,其特征在于,所述依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池,包括:
依据时间顺序循环执行以下流程,直至服务端程序退出:
依据所述启动参数的指示,搭建包含对应于当前时间的数量的线程的线程池;
依据所述启动参数的指示,设定下一时刻的定时器中断,以指示在到达下一时刻时重新搭建包含所述启动参数指示的数量的线程的线程池。
6.如权利要求3所述的基于动态线程池的远程过程调用方法,其特征在于,所述响应监听到的远程过程调用请求,从线程池中选择线程以执行所述远程过程调用请求的任务,包括:
响应监听到的远程过程调用请求,分配套接字的内存单元并初始化;
将分配的套接字与线程池中的线程进行动态绑定,以调用所绑定的线程执行所述远程过程调用请求的任务。
7. 如权利要求6所述的基于动态线程池的远程过程调用方法,其特征在于,所述将分配的套接字与线程池中的线程进行动态绑定,包括:
将分配的套接字与线程池中的空闲线程进行绑定,以及
在所绑定的线程执行完所述远程过程调用请求的任务后,解除所述套接字与所述线程的绑定,恢复该线程的空闲状态。
8.如权利要求6、7之一所述的基于动态线程池的远程过程调用方法,其特征在于,所述将分配的套接字与线程池中的线程进行动态绑定,包括:
将分配的套接字与线程池中的线程进行绑定时,执行该线程的resume()函数,进而调用wake_up()函数。
9.一种基于动态线程池的远程过程调用装置,应用于服务器设备,所述服务器设备与客户端设备通信连接,其特征在于,所述装置包括:
配置单元,用于接收配置的启动参数,所述启动参数指示在不同时间下线程池所包含的线程数量;
启动单元,用于依据所述启动参数启动服务端程序,包括依据所述启动参数的指示在不同时间搭建包含对应数量线程的线程池;
请求监听单元,用于监听客户端设备的远程过程调用请求;
任务执行单元,用于从线程池中选择线程执行所述请求监听单元所监听到的远程过程调用请求的任务,并将所述线程的执行结果反馈给所述客户端设备。
10.如权利要求9所述的基于动态线程池的远程过程调用装置,其特征在于,所述启动单元包括定时器,所述启动单元依据所述启动参数的指示设定所述定时器,并响应于到达所述定时器的计时,搭建包含所述启动参数指示的对应数量线程的线程池。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310094496.2A CN115794449B (zh) | 2023-02-10 | 2023-02-10 | 动态线程池构建方法、远程过程调用方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310094496.2A CN115794449B (zh) | 2023-02-10 | 2023-02-10 | 动态线程池构建方法、远程过程调用方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN115794449A true CN115794449A (zh) | 2023-03-14 |
CN115794449B CN115794449B (zh) | 2023-10-03 |
Family
ID=85430765
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310094496.2A Active CN115794449B (zh) | 2023-02-10 | 2023-02-10 | 动态线程池构建方法、远程过程调用方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115794449B (zh) |
Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080295107A1 (en) * | 2007-05-23 | 2008-11-27 | Fabrizio Muscarella | Adaptive Thread Pool |
CN105677391A (zh) * | 2015-12-30 | 2016-06-15 | 深圳联友科技有限公司 | 一种定时插件的实现方法及装置 |
CN108874537A (zh) * | 2018-04-11 | 2018-11-23 | 哈尔滨工程大学 | 基于分段的自适应动态调整线程池大小的方法 |
CN110865798A (zh) * | 2018-08-28 | 2020-03-06 | 中国移动通信集团浙江有限公司 | 一种线程池优化方法及系统 |
CN113157410A (zh) * | 2021-03-30 | 2021-07-23 | 北京大米科技有限公司 | 线程池调节方法、装置、存储介质及电子设备 |
CN113986502A (zh) * | 2021-10-29 | 2022-01-28 | 深圳市优必选科技股份有限公司 | 线程池管理方法、装置、计算机终端及存储介质 |
CN115269196A (zh) * | 2022-08-05 | 2022-11-01 | 中国平安财产保险股份有限公司 | 线程池动态创建方法、装置、设备及存储介质 |
CN115328625A (zh) * | 2022-07-26 | 2022-11-11 | 深圳前海环融联易信息科技服务有限公司 | 线程池参数处理方法、系统、计算机设备、介质及程序产品 |
US20230011628A1 (en) * | 2021-07-08 | 2023-01-12 | Oracle International Corporation | Management plane orchestration across service cells |
CN115617527A (zh) * | 2022-11-08 | 2023-01-17 | 咪咕文化科技有限公司 | 线程池的管理方法、配置方法、管理装置和配置装置 |
-
2023
- 2023-02-10 CN CN202310094496.2A patent/CN115794449B/zh active Active
Patent Citations (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20080295107A1 (en) * | 2007-05-23 | 2008-11-27 | Fabrizio Muscarella | Adaptive Thread Pool |
CN105677391A (zh) * | 2015-12-30 | 2016-06-15 | 深圳联友科技有限公司 | 一种定时插件的实现方法及装置 |
CN108874537A (zh) * | 2018-04-11 | 2018-11-23 | 哈尔滨工程大学 | 基于分段的自适应动态调整线程池大小的方法 |
CN110865798A (zh) * | 2018-08-28 | 2020-03-06 | 中国移动通信集团浙江有限公司 | 一种线程池优化方法及系统 |
CN113157410A (zh) * | 2021-03-30 | 2021-07-23 | 北京大米科技有限公司 | 线程池调节方法、装置、存储介质及电子设备 |
US20230011628A1 (en) * | 2021-07-08 | 2023-01-12 | Oracle International Corporation | Management plane orchestration across service cells |
CN113986502A (zh) * | 2021-10-29 | 2022-01-28 | 深圳市优必选科技股份有限公司 | 线程池管理方法、装置、计算机终端及存储介质 |
CN115328625A (zh) * | 2022-07-26 | 2022-11-11 | 深圳前海环融联易信息科技服务有限公司 | 线程池参数处理方法、系统、计算机设备、介质及程序产品 |
CN115269196A (zh) * | 2022-08-05 | 2022-11-01 | 中国平安财产保险股份有限公司 | 线程池动态创建方法、装置、设备及存储介质 |
CN115617527A (zh) * | 2022-11-08 | 2023-01-17 | 咪咕文化科技有限公司 | 线程池的管理方法、配置方法、管理装置和配置装置 |
Non-Patent Citations (3)
Title |
---|
ANTHONY AUER: ""Concurrency control generation for dynamic threads using discrete-event systems"", 《SCIENCE OF COMPUTER PROGRAMMING》, vol. 82, pages 22 - 43 * |
蚂蚁背大象: ""线程池的数量和线程池中线程数量如何设置-实践篇"", pages 1 - 13, Retrieved from the Internet <URL:《https://juejin.cn/post/7067183465224994852》> * |
谢文杰: ""雷达数据实时处理软件多线程技术的改进"", 《计算机应用》, vol. 38, no. 2, pages 250 - 253 * |
Also Published As
Publication number | Publication date |
---|---|
CN115794449B (zh) | 2023-10-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10977070B2 (en) | Control system for microkernel architecture of industrial server and industrial server comprising the same | |
CN106557369A (zh) | 一种多线程的管理方法及系统 | |
CN110795254A (zh) | 一种基于php处理高并发io的方法 | |
WO2020091916A1 (en) | Resource conservation for containerized systems | |
US20090113440A1 (en) | Multiple Queue Resource Manager | |
WO2023274278A1 (zh) | 一种资源调度的方法、装置及计算节点 | |
CN111580990A (zh) | 一种任务调度方法、调度节点、集中配置服务器及系统 | |
CN110569113A (zh) | 分布式任务的调度方法及系统、计算机可读存储介质 | |
US20240202024A1 (en) | Thread processing methods, scheduling component, monitoring component, server, and storage medium | |
US10523746B2 (en) | Coexistence of a synchronous architecture and an asynchronous architecture in a server | |
CN114461668A (zh) | 一种基于线程池的mysql数据库查询方法及装置 | |
CN115495262A (zh) | 一种微内核操作系统及进程间消息的处理方法 | |
CN109388501B (zh) | 基于人脸识别请求的通信匹配方法、装置、设备及介质 | |
WO2022257247A1 (zh) | 数据处理方法、装置及计算机可读存储介质 | |
CN114816709A (zh) | 任务调度方法、装置、服务器及可读存储介质 | |
WO2021212967A1 (en) | Task scheduling for distributed data processing | |
Caballero et al. | AutoPyFactory: a scalable flexible pilot factory implementation | |
CN112948088A (zh) | 一种云计算平台中的云工作流智能管理与调度系统 | |
CN117319376A (zh) | 文件下载控制方法、装置、电子设备及存储介质 | |
CN115794449A (zh) | 动态线程池构建方法、远程过程调用方法及装置 | |
CN113434591B (zh) | 数据处理方法以及装置 | |
CN115543574A (zh) | 应用于视频类数字藏品生成中的任务调度方法和系统 | |
CN114610441A (zh) | 基于yarn调度的flink参数优化方法、系统、设备和存储介质 | |
US12126698B2 (en) | Data processing method and apparatus, and computer-readable storage medium | |
CN114546631A (zh) | 任务调度方法、控制方法、核心、电子设备、可读介质 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |