CN108958951A - 一种优化方法、计算机设备和存储介质 - Google Patents

一种优化方法、计算机设备和存储介质 Download PDF

Info

Publication number
CN108958951A
CN108958951A CN201810590265.XA CN201810590265A CN108958951A CN 108958951 A CN108958951 A CN 108958951A CN 201810590265 A CN201810590265 A CN 201810590265A CN 108958951 A CN108958951 A CN 108958951A
Authority
CN
China
Prior art keywords
rpc
main thread
variable
thread
create
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
Application number
CN201810590265.XA
Other languages
English (en)
Other versions
CN108958951B (zh
Inventor
杨亮
张文明
陈少杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201810590265.XA priority Critical patent/CN108958951B/zh
Publication of CN108958951A publication Critical patent/CN108958951A/zh
Application granted granted Critical
Publication of CN108958951B publication Critical patent/CN108958951B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/54Interprogram communication
    • G06F9/547Remote procedure calls [RPC]; Web services

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Data Exchanges In Wide-Area Networks (AREA)

Abstract

本发明提供了一种优化方法,包括:通过创建RPC通信实例;设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行;设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输;根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。可以减少为RPC通信实例创建的线程数量,从而提高程序的稳定性。

Description

一种优化方法、计算机设备和存储介质
技术领域
本发明属于计算机技术领域,尤其涉及一种优化方法、计算机设备和存储介质。
背景技术
RPC(Remote Procedure Call,远程方法调用)是两个进程间进行通信的一种方法,在一些应用中,每创建一个RPC通信实例,就会在系统中创建多个线程来进行RPC任务队列的执行和数据的传输,。
由于每个RPC通信实例都需要创建多个线程,而线程又是操作系统中一个重要的资源,随着进程中创建的RPC通信实例越来越多,线程数量也随之增加,当线程的数量超过系统资源的承载能力时,将导致线程的创建失败,从而引起整个进程的崩溃。
发明内容
本申请实施例通过提供一种优化方法、计算机设备和存储介质,可以减少为RPC通信实例创建的线程数量,从而提高了程序的稳定性,解决了现有技术中,由于线程的数量太多而导致整个进程崩溃的问题。
第一方面,本申请通过本申请的一实施例,提供如下技术方案:
一种优化方法,包括:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
可选的,所述方法还包括:
通过RpcAddHandleIntoGlobal方法将所述RPC通信实例添加到所述全局线程中;
将添加到所述全局线程的所述RPC通信实例进行线程锁定。
可选的,所述方法还包括:
通过RpcRemoveHandleFromGlobal方法将指定RPC通信实例从所述全局线程中删除,所述指定RPC通信实例为指定的不需要通过所述全局线程处理RPC任务队列的执行和数据的传输的RPC通信实例;
将所述指定RPC通信实例进行线程解锁。
可选的,所述通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输包括:
通过所述RPC全局线程调用所述RpcPollService函数来调用所述RPC模块的RpcBase类中的poll方法,并在所述poll方法中,调用ProcAddTask方法处理所述RPC通信实例的RPC任务队列的执行,调用ioRun方法处理所述RPC通信实例的数据的传输。
第二方面,本申请通过本申请的一实施例,提供如下技术方案:
一种优化装置,所述装置包括:
第一创建单元,用于创建RPC通信实例;
第一设置单元,用于设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
第二设置单元,用于设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
确定单元,用于根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
第二创建单元,用于通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
处理单元,用于如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
可选的,所述装置还包括:
添加单元,用于通过RpcAddHandleIntoGlobal方法将所述RPC通信实例添加到所述全局线程中;
锁定单元,用于将添加到所述全局线程的所述RPC通信实例进行线程锁定。
可选的,所述装置还包括:
删除单元,用于通过RpcRemoveHandleFromGlobal方法将指定RPC通信实例从所述全局线程中删除,所述指定RPC通信实例为指定的不需要通过所述全局线程处理RPC任务队列的执行和数据的传输的RPC通信实例;
将所述指定RPC通信实例进行线程解锁。
可选的,所述处理单元具体用于:
通过所述RPC全局线程调用所述RpcPollService函数来调用所述RPC模块的RpcBase类中的poll方法,并在所述poll方法中,调用ProcAddTask方法处理所述RPC通信实例的RPC任务队列的执行,调用ioRun方法处理所述RPC通信实例的数据的传输。
第三方面,本申请通过本申请的一实施例,提供如下技术方案:
一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
第四方面,本申请通过本申请的一实施例,提供如下技术方案:
一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
可见,本申请提供的实施例,通过创建RPC通信实例;设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行;设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输;根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。可以减少为RPC通信实例创建的线程数量,从而提高程序的稳定性,解决了现有技术中,由于线程的数量太多而导致整个进程崩溃的问题。
附图说明
图1为本申请实施例中提供的优化方法的流程图;
图2为本申请实施例中提供的优化装置的结构示意图;
图3为本申请实施例中提供的计算机可读存储介质的结构示意图;
图4为本申请实施例中提供的计算机设备的结构示意图。
具体实施方式
本申请实施例提供了一种优化方法、计算机设备和存储介质,可以减少为RPC通信实例创建的线程数量,从而提高程序的稳定性,解决了现有技术中,由于线程的数量太多而导致整个进程崩溃的问题。
远程过程调用RPC是两个进程间进行通信的一种方法,就是一个进程调用另外一个进程所提供的方法,但是在调用者的角度仍然跟调用本进程的函数是一致的。在RPC的应用中,每创建一个RPC通信实例,就会在系统中创建多个线程,其中包括RPC模块中的RPC主线程,负责处理RPC任务队列的执行;还有RPC所依赖的IPC(InterProcessCommunicate,进程间通信)模块中的传输主线程,负责处理数据的传输。本实施例可以通过不创建这两个进程来控制线程的数量。
本申请实施例的技术方案为解决上述技术问题,总体思路如下:
创建RPC通信实例;设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行;设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输;根据所述第一变量和所述第二变量,确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程;创建RPC全局线程;通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。其中,RpcPollService函数可以用于轮询RPC通信实例中的任务。
为了更好的理解上述技术方案,以下结合附图以及具体实施例,对上述技术方案进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本申请,并不用于限定本申请。可以理解的是,本申请实施例使用的函数名称或变量名称等,并不用于限定本申请,在一些其他可能的实现方式中,也可以使用其他命名方式。
实施例一:
请参阅图1,本实施例提供的一种优化方法包括以下步骤:
S101、创建RPC通信实例。
具体的,创建RPC通信实例包括:调用RpcCreateInstance方法,创建RPC实例。RpcCreateInstance函数的原型如下:
HRPC RpcCreateInstance(RpcTransferMethod method,bool isServer,RpcCallbackFunction,void*userData)
可见该函数接收4个参数,其中第一个参数method表示采用什么样的数据通信方法,可选的值包括RPM_NAMED_PIPE,表示采用命名管道的方式进行数据传输;以及包括RPM_TCP_SOCKET,表示采用TCP进行数据传输;还包括RPM_UDP_SOCKET,表示采用UDP进行数据传输。
其中的第二个参数isServer表示是否创建RPC服务器实例,当该参数为true时,会创建一个RPC的服务器实例;为false时,会创建一个RPC的客户端实例。在RPC模块中,有三个重要的类,一个是RpcBase,一个是RpcServer,还有RpcClient。其中RpcBase是基础类,RpcServer代表一个RPC服务器类,它继承于RpcBase;RpcClient代表一个RPC客户端,也继承于RpcBase。当isServer为true时,该函数内部会创建一个RpcServer的实例,并将该实例返回;而当该参数为false时,该函数内部会创建一个RpcClient的实例,同样将该实例返回,从而完成RPC通信实例的创建。
S102、设置第一变量。
其中,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程RpcMainThread,所述RPC主线程RpcMainThread用于处理RPC任务队列的执行。
具体的,设置第一变量的步骤包括:
在RPC模块的RpcBase类中增加一个bool类型的第一变量m_isNoThread,所述第一变量的初始值为false,表示需要创建所述RPC主线程;在RPC模块中,RpcSetProperty方法可以用于设置RPC通信实例的相关属性,若不需要创建所述RPC主线程,通过调用RpcSetProperty方法将RPC_NO_THREAD枚举值传入到该方法中,从而设置RpcBase中的第一变量m_isNoThread的值为true,其中,第一变量m_isNoThread的值为true表示不需要创建所述RPC主线程。
S103、设置第二变量。
其中,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程IoTransferMainThread,所述传输主线程IoTransferMainThread用于处理数据的传输。
具体的,设置第二变量的步骤包括:
在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的第二变量m_isNoThread,所述第二变量的初始值为false,表示需要创建所述传输主线程。由于IPC模块是RPC模块的内部引用模块,所以第二变量m_isNoThead是IPC模块中的一个内部变量,RPC模块作为外部是不知道第二变量的存在的,而在IInterProcessCommunicate接口中,包括一个setOption方法,该方法可以设置IInterProcessCommunicate接口的相关属性,从而能够从外部设置IPC模块的内部变量,所以若不需要创建所述传输主线程,可以通过调用所述IPC模块的setOption方法,并将该方法的第一个参数设置为IPO_NO_THREAD,那么该方法内部就会将第二变量m_isNoThread值设置为true,其中,第二变量m_isNoThread的值为true表示不需要创建所述传输主线程。
需要说明的是,为了便于理解,本实施例中的第一变量和第二变量都命名为m_isNoThread,在一些可能的设计中,第一变量和第二变量可以命名为不同的名称,或者命名为相同的其他名称,此处不做太多限定。
S104、根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的RPC主线程和传输主线程。
当RPC实例创建完后,还包括调用RpcStartService方法来启动RPC的步骤,其中当该RPC实例为一个服务器实例时,会启动服务;而当该实例为一个客户端实例时,会进行连接到服务器的操作。本实施例中,所述第一变量和所述第二变量的默认值为false,根据所述第一变量和所述第二变量的值为false,在调用BaseInterProcessCommunicate类的startThread方法来创建线程时,需要为RPC通信实例创建RPC主线程和传输主线程。若不需要创建RPC主线程和传输主线程,本实施例可以在调用RpcStartService方法启动RPC时,调用所述RPC模块的RpcSetProperty方法将RPC_NO_THREAD枚举值传入到该方法中,从而设置RpcBase中的第一变量m_isNoThread的值为true,同时,调用所述IPC模块的setOption方法,并将该方法的第一个参数设置为IPO_NO_THREAD,从而将第二变量m_isNoThread值设置为true。由于第一变量和第二变量的值已设置为true,当在调用BaseInterProcessCommunicate类的startThread方法来创建线程时,根据所述第一变量的值为ture,确定不需要创建所述RPC通信实例的RPC主线程,根据所述第二变量的值为ture,确定不需要创建所述RPC通信实例的传输主线程。
S105、通过初始化RPC模块的RpcGlobal类来创建RPC全局线程。
如果在系统应用中创建了多个RPC通信实例,并且这多个RPC通信实例都没有创建内部工作线程,本文中内部工作线程指RPC主线程和传输主线程,全文采用相同的描述,不再赘述。那么在上层开发中,需要对这多个RPC通信实例调用其RpcPollService方法,来完成原有在内部线程中所要处理的任务队列的执行和数据的传输,这样将导致RPC接口的使用比较麻烦。本实施例通过创建RPC全局线程,在RPC模块中只用一个线程来处理任意多个没有创建内部工作线程的RPC通信实例的RpcPollService方法。
具体的,创建RPC全局线程包括:通过初始化RPC模块的RpcGlobal类来创建RPC全局线程。其中,RpcGlobal类是一个单例类,即只允许创建一个实例的类,初始化该单例类后,会创建一个RPC全局线程RpcGlobalThread。
进一步的,在RpcGlobal类中,有一个m_rpcList的数据集合,该集合中存储有无内部工作线程的RPC实例。并且在RpcGlobal类的内部,有一个addRpc方法用来将一个无内部工作线程的RPC实例添加到m_rpcList数据集合中;以及一个removeRpc方法,用来将一个指定的RPC实例从m_rpcList数据集合中移除。由于RpcGlobal是不对外暴露的类,也就是外部不能访问RpcGlobal中的方法,所以在本实施例中,提供了下面的两个方法,将RPC实例添加到全局线程,或移出全局线程。
(1)通过RpcAddHandleIntoGlobal方法将所述RPC通信实例添加到所述全局线程中,将添加到所述全局线程的所述RPC通信实例进行线程锁定。
具体的,RpcAddHandleIntoGlobal方法的功能就是将一个RPC通信实例添加到RPC全局线程中,但是在添加之前,需要判断该RPC通信实例是否自带工作线程,如果有则返回失败;如果没有自带线程,那么调用RpcGlobal的addRpc方法,将该实例添加到RPC全局线程中。其中,可以调用RpcBase的hasThread方法可以判断该RPC实例是否创建了内部线程。
RPC通信实例添加到RPC全局线程中后,需要对该RPC通信实例进行线程锁定,目的在于当RPC实例添加到RPC全局线程之后,除了RPC全局线程之外,任何其他的线程都不能调用RpcPollService方法来操作该RPC通信实例,如果不对添加到RPC全局线程的RPC通信实例进行线程锁定,极有可能造成有多个线程同时在处理该RPC通信实例的数据传输功能,从而导致数据接收错误。具体的,可以调用RPC通信实例的RpcBase中的lockThread方法,将RpcBase中的m_lockThead成员设置为true来将RPC通信实例进行线程锁定。
(2)通过RpcRemoveHandleFromGlobal方法将指定RPC通信实例从所述全局线程中删除,所述指定RPC通信实例为指定的不需要通过所述全局线程处理RPC任务队列的执行和数据的传输的RPC通信实例,将所述指定RPC通信实例进行线程解锁。
具体的,RpcRemoveHandleFromGlobal方法的功能就是将指定RPC通信实例从RPC全局线程中删除,在该方法中,直接调用RpcGlobal的removeRpc方法,将指定RPC通信实例从RpcGlobal类的m_rpcList中移除。
当指定RPC通信实例从RPC全局线程中删除之后,还应该对该RPC通信实例进行线程解锁,即解除线程锁定,这样外部的其他线程就可以调用
RpcPollService函数完成该RPC通信实例的任务队列执行和数据的传输。其中,通过调用RPC通信实例的RpcBase中的unlockThread方法,将RpcBase中的m_lockThread成员设置为false,从而完成解除线程锁定操作。
S106、通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
由于所述RPC主线程用于处理RPC任务队列的执行,所述传输主线程用于处理数据的传输,在未创建RPC主线程和传输主线程的情况下,必须解决RPC任务队列的执行和数据的传输问题。本实施例中,通过所述RPC全局线程调用所述RpcPollService函数来调用所述RPC模块的RpcBase类中的poll方法,并在所述poll方法中,调用ProcAddTask方法处理所述RPC通信实例的RPC任务队列的执行,调用ioRun方法处理所述RPC通信实例的数据的传输。
具体的,在RpcBase基础类中,包括一个poll方法,在所述poll方法中,首先判断第一变量m_isNoThread是否为true,如果为true,再调用m_queue任务队列的ProcAddTask方法执行任务队列中的所有任务,从而接管RPC主线程RpcMainThread的工作,与此同时,由于IPR模块是内部引用模块,通过外部RPC模块调用IInterProcessCommunicate接口的m_communicate成员的poll方法,在该方法中,首先判断第二变量m_isNoThread是否为true,如果为true,调用ioRun方法处理所述RPC通信实例的数据的传输,从而接管传输主线程IoTransferMainThread的工作。
需要说明的是,由于RpcBase的poll方法是一个内部函数,所以在RPC模块对外提供的RpcPollService方法中,其内部直接调用RpcBase的poll方法,从而实现RPC任务队列的执行以及数据的传输。
本实施例中,通过全局线程调用RpcPollService函数来处理每个添加到全局线程中的RPC通信实例的RPC任务队列的执行以及数据的传输,避免了在上层开发中,需要对每个添加到全局线程的RPC通信实例调用其RpcPollService方法,来完成原有在内部线程中所要处理的任务队列的执行和数据的传输,可以使接口的使用更加方便。
可见,本实施例通过创建RPC通信实例;设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行;设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输;根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。可以减少为RPC通信实例创建的线程数量,从而提高程序的稳定性,解决了现有技术中,由于线程的数量太多而导致整个进程崩溃的问题。
基于同一发明构思,本申请提供了一种优化装置,详见图2,下面将结合图2对实施例二进行介绍。
实施例二:
请参阅图2,本实施例提供的优化装置包括:
第一创建单元201,用于创建RPC通信实例;
第一设置单元202,用于设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
第二设置单元203,用于设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
确定单元204,用于根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
第二创建单元205,用于通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
处理单元206,用于如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
可见,本实施例通过第一创建单元201创建RPC通信实例;第一设置单元202设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行;第二设置单元203设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输;确定单元204根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;第二创建单元205通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则处理单元206通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。可以减少为RPC通信实例创建的线程数量,从而提高程序的稳定性,解决了现有技术中,由于线程的数量太多而导致整个进程崩溃的问题。
本申请实施例二提供的优化装置及本申请实施例一提供的优化方法属于同一构思,其具体实现过程详见说明书全文,此处不再赘述。
基于同一发明构思,本申请提供了一种计算机可读存储介质,详见图3,下面将结合图3对实施例三进行介绍。
实施例三:
本实施例提供了一种计算机可读存储介质300,所述计算机可读存储介质300存储有计算机程序311,所述计算机程序311被处理器执行时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
在具体实施过程中,该计算机程序311被处理器执行时,可以实现实施例一中任一实施方式。
基于同一发明构思,本申请还提供了一种计算机设备,详见图4,下面将结合图4对实施例四进行介绍。
实施例四:
本申请提供了一种计算机设备400,包括处理器420、存储器410以及存储在存储器410上并可在处理器420上运行的计算机程序411,所述处理器420执行所述计算机程序411时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
由于本实施例所介绍的计算机设备400为实施本申请实施例一中多进程解码的播放方法所采用的设备,故而基于本申请实施例一中所介绍的方法,本领域所属技术人员能够了解本实施例的计算机设备400的具体实施方式以及其各种变化形式,所以在此对于该计算机设备400如何实现本申请实施例中的方法不再详细介绍。只要本领域所属技术人员实施本申请实施例中的方法所采用的设备,都属于本申请所欲保护的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
本申请的说明书和权利要求书及上述附图中的术语“第一”、“第二”、“第三”、“第四”等(如果存在)是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。此外,术语“包括”和以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种优化方法,其特征在于,所述方法包括:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
2.如权利要求1所述的方法,其特征在于,所述方法还包括:
通过RpcAddHandleIntoGlobal方法将所述RPC通信实例添加到所述全局线程中;
将添加到所述全局线程的所述RPC通信实例进行线程锁定。
3.如权利要求1所述的方法,其特征在于,所述方法还包括:
通过RpcRemoveHandleFromGlobal方法将指定RPC通信实例从所述全局线程中删除,所述指定RPC通信实例为指定的不需要通过所述全局线程处理RPC任务队列的执行和数据的传输的RPC通信实例;
将所述指定RPC通信实例进行线程解锁。
4.如权利要求1-3任一项所述的方法,其特征在于,所述通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输包括:
通过所述RPC全局线程调用所述RpcPollService函数来调用所述RPC模块的RpcBase类中的poll方法,并在所述poll方法中,调用ProcAddTask方法处理所述RPC通信实例的RPC任务队列的执行,调用ioRun方法处理所述RPC通信实例的数据的传输。
5.一种优化装置,其特征在于,所述装置包括:
第一创建单元,用于创建RPC通信实例;
第一设置单元,用于设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
第二设置单元,用于设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
确定单元,用于根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
第二创建单元,用于通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
处理单元,用于如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
6.如权利要求5所述的装置,其特征在于,所述装置还包括:
添加单元,用于通过RpcAddHandleIntoGlobal方法将所述RPC通信实例添加到所述全局线程中;
锁定单元,用于将添加到所述全局线程的所述RPC通信实例进行线程锁定。
7.如权利要求5所述的装置,其特征在于,所述装置还包括:
删除单元,用于通过RpcRemoveHandleFromGlobal方法将指定RPC通信实例从所述全局线程中删除,所述指定RPC通信实例为指定的不需要通过所述全局线程处理RPC任务队列的执行和数据的传输的RPC通信实例;
将所述指定RPC通信实例进行线程解锁。
8.如权利要求5-7任一项所述的装置,其特征在于,所述处理单元具体用于:
通过所述RPC全局线程调用所述RpcPollService函数来调用所述RPC模块的RpcBase类中的poll方法,并在所述poll方法中,调用ProcAddTask方法处理所述RPC通信实例的RPC任务队列的执行,调用ioRun方法处理所述RPC通信实例的数据的传输。
9.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
10.一种计算机设备,包括处理器、存储器以及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现以下步骤:
创建RPC通信实例;
设置第一变量,所述第一变量用于指示是否创建所述RPC通信实例的RPC主线程,所述RPC主线程用于处理RPC任务队列的执行,其中,通过在RPC模块的RpcBase类中增加一个bool类型的所述第一变量,所述第一变量的初始值为false,表示需要创建所述RPC主线程;若不需要创建所述RPC主线程,通过调用所述RPC模块的RpcSetProperty方法将所述第一变量的值改为true,表示不需要创建所述RPC主线程;
设置第二变量,所述第二变量用于指示是否创建所述RPC通信实例的传输主线程,所述传输主线程用于处理数据的传输,其中,通过在IPC模块的BaseInterProcessCommunicate类中增加一个bool类型的所述第二变量,所述第二变量的初始值为false,表示需要创建所述传输主线程;若不需要创建所述传输主线程,通过调用所述IPC模块的setOption方法将所述第二变量的值改为true,表示不需要创建所述传输主线程;
根据所述第一变量和所述第二变量,确定是否创建所述RPC通信实例的所述RPC主线程和所述传输主线程;
通过初始化RPC模块的RpcGlobal类来创建RPC全局线程;
如果确定不创建所述RPC通信实例的所述RPC主线程和所述传输主线程,则通过所述RPC全局线程调用RpcPollService函数处理所述RPC通信实例的RPC任务队列的执行和数据的传输。
CN201810590265.XA 2018-06-08 2018-06-08 一种优化方法、计算机设备和存储介质 Active CN108958951B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810590265.XA CN108958951B (zh) 2018-06-08 2018-06-08 一种优化方法、计算机设备和存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810590265.XA CN108958951B (zh) 2018-06-08 2018-06-08 一种优化方法、计算机设备和存储介质

Publications (2)

Publication Number Publication Date
CN108958951A true CN108958951A (zh) 2018-12-07
CN108958951B CN108958951B (zh) 2021-05-28

Family

ID=64488198

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810590265.XA Active CN108958951B (zh) 2018-06-08 2018-06-08 一种优化方法、计算机设备和存储介质

Country Status (1)

Country Link
CN (1) CN108958951B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112000909A (zh) * 2020-10-29 2020-11-27 南京研利科技有限公司 用于浏览器信息处理算的方法、计算设备和存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247676A (en) * 1989-06-29 1993-09-21 Digital Equipment Corporation RPC based computer system using transparent callback and associated method
US8205202B1 (en) * 2008-04-03 2012-06-19 Sprint Communications Company L.P. Management of processing threads
KR20130041540A (ko) * 2011-10-17 2013-04-25 엔에이치엔(주) 코루틴을 이용하여 원격 프로시저 호출 서비스를 제공하는 방법 및 장치
CN103645940A (zh) * 2013-12-04 2014-03-19 清华大学 远程调用方法及系统
CN106161537A (zh) * 2015-04-10 2016-11-23 阿里巴巴集团控股有限公司 远程过程调用的处理方法、装置、系统及电子设备
CN106648940A (zh) * 2017-03-13 2017-05-10 北京百悟科技有限公司 远程过程调用方法及装置

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247676A (en) * 1989-06-29 1993-09-21 Digital Equipment Corporation RPC based computer system using transparent callback and associated method
US8205202B1 (en) * 2008-04-03 2012-06-19 Sprint Communications Company L.P. Management of processing threads
KR20130041540A (ko) * 2011-10-17 2013-04-25 엔에이치엔(주) 코루틴을 이용하여 원격 프로시저 호출 서비스를 제공하는 방법 및 장치
CN103645940A (zh) * 2013-12-04 2014-03-19 清华大学 远程调用方法及系统
CN106161537A (zh) * 2015-04-10 2016-11-23 阿里巴巴集团控股有限公司 远程过程调用的处理方法、装置、系统及电子设备
CN106648940A (zh) * 2017-03-13 2017-05-10 北京百悟科技有限公司 远程过程调用方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
KALVINC: "2.Google RPC-线程池", 《HTTPS://BLOG.CSDN.NET/LKLZYY/ARTICLE/DETAILS/44728729》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112000909A (zh) * 2020-10-29 2020-11-27 南京研利科技有限公司 用于浏览器信息处理算的方法、计算设备和存储介质

Also Published As

Publication number Publication date
CN108958951B (zh) 2021-05-28

Similar Documents

Publication Publication Date Title
Da et al. Kalimucho: middleware for mobile applications
CN105704188B (zh) 应用与服务的部署方法和装置
CN103218220A (zh) 基于动态可插拔组件的物联网中间件系统
CN110187912A (zh) 一种节点选择方法和装置
CN114281263B (zh) 容器集群管理系统的存储资源处理方法、系统和设备
CN104615489A (zh) 一种多节点数据交互的实现方法
CN109582458A (zh) 资源信息加载方法、装置、存储介质及处理器
CN105320558A (zh) 一种移动终端及其启动的方法
Alizadeh et al. A brief review of mobile cloud computing opportunities
CN108958951A (zh) 一种优化方法、计算机设备和存储介质
CN112698930B (zh) 一种获取服务器标识的方法、装置、设备及介质
EP2400390A1 (en) Provision of services and libraries to remote clients
CN104572275B (zh) 一种进程加载方法、装置及系统
US20150229526A1 (en) Configuration of network devices in a network
CN108334374A (zh) 组件动态加载与执行的方法和装置
CN104461553A (zh) 一种符合smi-s标准的存储管理方法
CN111324395A (zh) 调用方法、装置和计算机可读存储介质
CN110516130A (zh) 元数据处理方法及装置、存储介质、电子装置
CN106528219A (zh) 应用程序中寄生工具包的升级方法及装置
CN108920246A (zh) 表单草稿组件共享方法及装置、终端设备及可读存储介质
CN111770179B (zh) 一种高性能高可用云化联网网关实现方法、介质及终端
CN103488527A (zh) 一种php api调用方法、相关设备及系统
Portillo et al. A Reflective Approach to Providing Flexibility in Application Distribution
Zheng et al. Modeling and Analysis of ZigBee Based Smart Home System
CN108776623A (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