发明内容
为了克服现有技术中的上述不足,本发明的目的在于提供一种接口任务调用方法,应用于电子设备,所述方法包括:
建立任务队列以及用于处理所述任务队列中任务的循环处理函数;
接收工作线程投递的回调任务并放入所述任务队列中,其中,所述回调任务由该工作线程需要调用的目标数据接口封装而成,所述回调任务包括相应的优先等级;
使用所述循环处理函数批量提取并存储所述任务队列中的所述回调任务,并根据所述回调任务的优先等级依次处理所述回调任务。
进一步地,在上述方法中,所述方法还包括:
在处理完当前轮次提取出的回调任务后,再次从所述任务队列中批量提取新的未处理的回调任务。
进一步地,在上述方法中,所述使用所述循环处理函数批量提取并存储所述任务队列中的所述回调任务的步骤,包括:
每间隔一预设时间从所述任务队列中批量提取所述回调任务。
进一步地,在上述方法中,所述回调任务包括重要程度较高需要立即处理的第一等级任务、可以延时处理的第二等级任务及可以在线程空闲时处理的第三等级任务;所述根据所述回调任务的优先等级依次处理所述回调任务的步骤,包括:
对提取出的所述第一等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务时,对所述第二等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务及未处理的第二等级任务时,对提取出的第三等级任务进行处理。
进一步地,在上述方法中,所述方法还包括:
所述循环处理函数在检测到所述任务队列中没有回调任务时,执行预设的等待函数,进入休眠状态。
进一步地,在上述方法中,所述方法还包括:
所述循环处理函数在休眠状态时,检测是否有回调任务投递到所述任务队列;
当检测到有回调任务投递到所述任务队列是,唤醒所述循环处理函数从所述任务队列提取回调任务并进行处理。
本发明的另一目的在于提供一种接口任务调用装置,应用于电子设备,所述装置包括:
建立模块,用于建立任务队列以及用于处理所述任务队列中任务的循环处理函数;
接收模块,用于接收工作线程投递的回调任务并放入所述任务队列中,其中,所述回调任务由该工作线程需要调用的目标数据接口封装而成,所述回调任务包括相应的优先等级;
任务处理模块,用于使用所述循环处理函数批量提取并存储所述任务队列中的所述回调任务,并根据所述回调任务的优先等级依次处理所述回调任务。
进一步地,在上述装置中,所述装置还包括:
循环提取模块,用于在处理完当前轮次提取出的回调任务后,再次从所述任务队列中批量提取新的未处理的回调任务。
进一步地,在上述装置中,所述任务处理模块通过以下方式提取并存储所述任务队列中的所述回调任务:
每间隔一预设时间从所述任务队列中批量提取所述回调任务。
进一步地,在上述装置中,所述回调任务包括重要程度较高需要立即处理的第一等级任务、可以延时处理的第二等级任务及可以在线程空闲时处理的第三等级任务;所述任务处理模块通过以下方式处理所述回调任务:
对提取出的所述第一等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务时,对所述第二等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务及未处理的第二等级任务时,对提取出的第三等级任务进行处理。
相对于现有技术而言,本发明具有以下有益效果:
本发明提供的一种接口任务调用方法及装置,通过将需要调用的目标接口封装为回调任务,工作线程在需要调用目标数据接口时,向任务队列投递相应的回调任务,然后循环处理函数对投递回调任务进行依次处理。如此,本实施例提供的方法可以最快的速度实现线程逐个调用访问目标数据接口,并且没有多余的加锁操作,节约了系统运行资源,提高了多线程并发的处理能力。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
请参照图1,图1为本实施例提供的电子设备100的示意图,本实施例中,所述电子设备100可以是,但不限于,服务器、智能手机、个人电脑(personal computer,PC)、平板电脑、个人数字助理(personal digital assistant,PDA)、移动上网设备(mobile Internetdevice,MID)等。
所述电子设备100包括接口任务调用装置110、存储器120及处理器130。
所述存储器120以及处理器130各元件相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。所述接口任务调用装置110包括至少一个可以软件或固件(firmware)的形式存储于所述存储器120中或固化在所述电子设备100的操作系统(operating system,OS)中的软件功能模块。所述处理器130用于执行所述存储器120中存储的可执行模块,例如所述接口任务调用装置110所包括的软件功能模块及计算机程序等。
其中,所述存储器120可以是,但不限于,随机存取存储器(Random AccessMemory,RAM),只读存储器(Read Only Memory,ROM),可编程只读存储器(ProgrammableRead-Only Memory,PROM),可擦除只读存储器(Erasable Programmable Read-OnlyMemory,EPROM),电可擦除只读存储器(Electric Erasable Programmable Read-OnlyMemory,EEPROM)等。其中,存储器120用于存储程序,所述处理器130在接收到执行指令后,执行所述程序。
所述处理器130可能是一种集成电路芯片,具有信号的处理能力。上述的处理器可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、网络处理器(NetworkProcessor,NP)等;还可以是数字信号处理器(DSP)、专用集成电路(ASIC)、现场可编程门阵列(FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
在本实施例中,将需要访问的目标数据接口封装为回调(callback)任务,即工作线程在需要访问所述目标数据接口时,投递对应的回调任务,所述电子设备100依次处理抽象出来的回调任务。如此,可以在不采用对工作线程加锁的情况下,实现对所述目标数据接口访问的控制,使同一时间只有一个工作线程访问所述目标数据接口。
请参照图2,图2为应用于图1所示的电子设备100的一种接口任务调用方法的流程图,以下将对所述方法包括各个步骤进行详细阐述。
步骤S110,建立任务队列以及用于处理所述任务队列中任务的循环处理函数。
在本实施例中,首先定义一个任务接收对象(例如,IncomingTaskQueue对象),该任务接收对象内部创建一个std::queue<PendingTask>的任务队列。该任务队列用来保存从工作线程投递过来的回调任务。因为std::queue结构具有从队列的首部和尾部访问数据更快速的优点,可以在接收到大量投递的回调任务时,可以及时存入队列中。
然后定义线程的循环处理函数的对象,即定义一个消息循环MessageLoop对象,该MessageLoop对象是线程运行的实际主体。利用消息循环的方式从IncomingTaskQueue对象获取回调任务并执行,每次优先执行MessageLoop中保存的任务,这样就不用每次频繁的从IncomingTaskQueue获取任务,可以提高消息循环的运行速度。
接着调用CreateThread(threadProc)函数创建一个线程,threadProc为该线程的运行过程接口。然后在threadProc内部运行MessageLoop的Run函数,开启线程的消息循环,等待处理callback任务。
步骤S120,接收工作线程投递的回调任务并放入所述任务队列中,其中,所述回调任务由该工作线程需要调用的目标数据接口封装而成,所述回调任务包括相应的优先等级。
在本实施例中,所述工作线程在需要访问目标数据接口时,向所述任务队列投递相应的回调任务。所述回调任务可以根据重要性设置相应的优先等级。例如,所述回调任务可以包括:重要程度较高,需要立即处理的第一等级任务,在本实施例中可以记为PostTask;可以延时处理的第二等级任务,在本实施例中可以记为PostDelayedTask;可以在线程空闲时处理的第三等级任务,在本实施例中,可以记为PostIdleWork。
步骤S130,使用所述循环处理函数批量提取并存储所述任务队列中的所述回调任务,并根据所述回调任务的优先等级依次处理所述回调任务。
在本实施例的一种具体实施方式中,请参照图3,所述方法还可以包括步骤S140。
步骤S140,在处理完当前轮次提取出的回调任务后,再次从所述任务队列中批量提取新的未处理的回调任务。如此,实现所述回调任务的循环提取处理。
在本实施例的另一种具体实施方式中,所述循环处理函数可以每间隔一预设时间从所述任务队列中批量提取所述回调任务。如此可实现所述回调任务的循环提取处理。
所述循环处理函数在处理提取出的回调任务时,由于所述第一等级任务重要程度较高,首先对提取出的所述第一等级任务进行处理。
在提取出的回调任务中不存在未处理的所述第一等级任务时,再对所述第二等级任务进行处理。
在提取出的回调任务中不存在未处理的所述第一等级任务及未处理的第二等级任务时,再对提取出的第三等级任务进行处理。也即,所述循环处理函数在检测到提取出的回调任务重没有所述第一等级任务及第二等级任务后,再对所述第二等级任务进行处理。因为所述第三等级任务属于空闲任务,所以在线程空闲时用来处理该类型任务,如此可以提高线程的利用率,最大程度利用线程的处理能力。
可选地,在本实施例中,所述循环处理函数在从所述任务队列中提取回调任务时,若测到所述任务队列中没有回调任务,则执行预设的等待函数,进入休眠状态。当所有回调任务都处理完毕时,MessageLoop对象会暂时调用wait函数,使线程进入后台休眠状态。如此可以减少程序运行线程的性能消耗。
可选地,在本实施例中,所述循环处理函数在休眠状态时,检测是否有回调任务投递到所述任务队列。当检测到有回调任务投递到所述任务队列是,唤醒所述循环处理函数从所述任务队列提取回调任务并进行处理。即工作线程有回调任务投递过来时,会调用ScheduleWork唤醒当前线程的MessageLoop消息循环,继续等待执行回调任务。
基于上述设计,在有多个任务同时需要调用目标数据解救时,本实施例提供的方法可以以最快的速度实现逐个线程调用目标数据接口。并且没有多余的加锁的操作,节约了系统运行资源,提高了多线程并发的处理能力。
请参照图4,本实施例还提供一种应用于图1所示电子设备100被的接口任务调用装置110,所述装置包括建立模块111、接收模块112及任务处理模块113。
所述建立模块111,用于建立任务队列以及用于处理所述任务队列中任务的循环处理函数。
本实施例中,所述建立模块111可用于执行图2所示的步骤S110,关于所述建立模块111的具体描述可参对所述步骤S110的描述。
所述接收模块112,用于接收工作线程投递的回调任务并放入所述任务队列中,其中,所述回调任务由该工作线程需要调用的目标数据接口封装而成,所述回调任务包括相应的优先等级。
本实施例中,所述接收模块112可用于执行图2所示的步骤S120,关于所述接收模块112的具体描述可参对所述步骤S120的描述。
所述任务处理模块113,用于使用所述循环处理函数批量提取并存储所述任务队列中的所述回调任务,并根据所述回调任务的优先等级依次处理所述回调任务。
本实施例中,所述任务处理模块113可用于执行图2所示的步骤S130,关于所述任务处理模块113的具体描述可参对所述步骤S130的描述。
可选地,在本实施例的一种实施方式中,所述装置还包括循环提取模块。
所述循环提取模块,用于在处理完当前轮次提取出的回调任务后,再次从所述任务队列中批量提取新的未处理的回调任务。
可选地,在本实施例的另一种实施方式中,所述任务处理模块113通过以下方式提取并存储所述任务队列中的所述回调任务:
每间隔一预设时间从所述任务队列中批量提取所述回调任务。
可选地,在本实施例中,所述回调任务包括重要程度较高需要立即处理的第一等级任务、可以延时处理的第二等级任务及可以在线程空闲时处理的第三等级任务;所述任务处理模块113通过以下方式处理所述回调任务:
对提取出的所述第一等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务时,对所述第二等级任务进行处理;
在提取出的回调任务中不存在未处理的所述第一等级任务及未处理的第二等级任务时,对提取出的第三等级任务进行处理。
综上所述,本发明提供的一种接口任务调用方法及装置,通过将需要调用的目标接口封装为回调任务,工作线程在需要调用目标数据接口时,向任务队列投递相应得到回调任务,然后循环处理函数对投递回调任务进行依次处理。如此,本实施例提供的方法可以以最快的速度实现线程逐个调用访问目标数据接口,并且没有多余的加锁的操作,节约了系统运行资源,提高了多线程并发的处理能力。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本发明的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本发明各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。