CN108089919B - 一种并发处理api请求的方法及*** - Google Patents
一种并发处理api请求的方法及*** Download PDFInfo
- Publication number
- CN108089919B CN108089919B CN201711395321.6A CN201711395321A CN108089919B CN 108089919 B CN108089919 B CN 108089919B CN 201711395321 A CN201711395321 A CN 201711395321A CN 108089919 B CN108089919 B CN 108089919B
- Authority
- CN
- China
- Prior art keywords
- current
- task
- triple
- coroutine
- request
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 31
- 230000007246 mechanism Effects 0.000 claims description 14
- 230000006378 damage Effects 0.000 description 3
- 238000004891 communication Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- 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
- 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
- G06F9/5038—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 considering the execution order of a plurality of tasks, e.g. taking priority or time dependency constraints into consideration
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Telephonic Communication Services (AREA)
Abstract
本发明提供一种并发处理API请求的方法及***,所述方法包括:S1,若当前API请求对应的当前任务包括I/O操作,则使用当前服务协程生成所述当前任务的第一三元组;S2,当所述当前服务协程异步等待时间达到预设时长时,将所述主线程的调度逻辑切换到满足预设条件的其他服务协程,获取所述其他服务协程生成的第二三元组;S3,根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用调度线程将所述当前任务和所述其他任务分配到等待队列中;S4,使用任务处理线程对当前任务和其他任务进行处理,将处理结果保存到第一三元组和第二三元组的请求结果队列中。本发明实现了对API请求的保序高并发处理。
Description
技术领域
本发明属于网络通信技术领域,更具体地,涉及一种并发处理API请求的方法及***。
背景技术
大型软件***为了实现扩展性、模块解耦和代码重用,一般采用面向服务的架构,即整个软件***由提供各种不同服务的API模块组成。最初的API服务架构由单进程和单线程实现。为了提高服务的并发能力,通常会使用多进程、多线程或协程的方式实现。
多进程架构的问题在于进程间通信的复杂性,难以维护全局资源锁,且线程上下文切换带来资源开销。此外,多进程和多线程架构都面临无法保序响应API请求的问题。例如,当对于同一个资源对象的不同API请求先后到达时,API服务端由于缺乏上下文切换控制机制和请求排队机制,进程及线程完全由CPU随机调度,可能导致后到达的API先执行或并发交替执行,执行结果违背API调用者的初衷。这样的情况在I/O(Input/Output,输入/输出)过程密集的情况下更为突出,例如对于改变某个资源状态的耗时API,连续调用两次API后该资源的最终状态是无法预知的。
协程架构由程序员控制操作逻辑的切换,但当异步IO较多时,精细控制切换逻辑对程序员的要求很高,容易出错。另外,已有的大量代码、程序、第三方库等并不支持异步IO,不能被协程调用,也使得协程架构经常丧失并发能力。
因此,如何在保证API服务高并发能力的同时,支持对API请求的保序处理成为当前亟需解决的问题。
发明内容
为克服上述不能同时实现API请求的高并发处理和保序处理的问题或者至少部分地解决上述问题,本发明提供了一种并发处理API请求的方法及***。
根据本发明的第一方面,提供一种并发处理API请求的方法,包括:
S1,若当前API请求对应的当前任务包括I/O操作,则使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程是在主线程中为所述当前API请求预先创建的;
S2,当所述当前服务协程异步等待时间达到预设时长时,将所述主线程的调度逻辑切换到满足预设条件的其他服务协程,获取所述其他服务协程生成其他API请求对应的其他任务的第二三元组;
S3,根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;
S4,使用预先创建的任务处理线程对所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应。
具体地,所述步骤S1之前还包括:
在API服务启动时,创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程;
当当前API请求到达主线程时,在所述主线程中为所述当前API请求创建一个当前服务协程。
具体地,所述步骤S1还包括:
若所述当前API请求对应的所述当前任务不包括I/O操作,则使用所述当前服务协程执行所述当前任务。
具体地,所述第一三元组包括所述当前任务、所述当前API请求的请求结果队列和所述当前任务的保序标识符;
所述第二三元组包括所述其他任务、所述其他API请求的请求结果队列和所述其他任务的保序标识符。
具体地,所述步骤S2具体包括:
计算各所述其他服务协程的剩余等待时长;
将所述主线程的调度逻辑切换到所述剩余等待时长最短的所述其他服务协程。
具体地,所述步骤S2具体包括:
每隔所述预设时长使用所述当前服务协程检测所述第一三元组中的请求结果队列;
若所述第一三元组中的请求结果队列中有结果,则返回所述请求结果队列中的API,终止所述当前服务协程;或者
若所述第一三元组中的请求结果队列中没有结果,则所述当前服务协程继续等待。
具体地,所述步骤S2还包括:
分别计算所述主线程中各其他服务协程和请求协程的剩余等待时长,所述请求协程用于接收API请求;
若所述剩余等待时长最短的协程为所述请求协程,则使用所述请求协程等待并接收下一个API请求。
具体地,所述步骤S2之后还包括:
将所述第一三元组和所述第二三元组保存到调度队列中;
相应地,所述步骤S3具体包括:
使用所述调度线程依次从所述调度队列中获取所述第一三元组和所述第二三元组中的保序标识符。
具体地,所述步骤S3具体包括:
若所述等待队列中存在所述第一三元组和/或所述第二三元组中保序标识符的第一任务,则将与所述第一任务的保序标识符相同的当前任务或其他任务分配到所述第一任务所在的等待队列中;或者,
若预先创建的任务处理线程正在处理所述第一三元组和/或所述第二三元组中保序标识符的第二任务,则将与所述第二任务的保序标识符相同的当前任务或其他任务分配到所述第二任务所在的等待队列中;或者,
若所述等待队列中不存在所述第一任务且所述任务处理线程没有正在处理所述第二任务,则将所述当前任务和其他任务分配到长度最小的所述等待队列中。
根据本发明的第二方面,提供一种并发处理API请求的***,包括:
生成单元,用于在当前API请求对应的当前任务包括I/O操作时,使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程为在主线程中预先为所述当前API请求创建的;
切换单元,用于当所述当前服务协程异步等待时间达到预设时长时,使用异步等待机制将所述主线程的调度逻辑切换到其他服务协程,获取其他服务协程生成其他API请求对应的其他任务的第二三元组;
分配单元,用于根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;
处理单元,用于使用预先创建的任务处理线程对对应的所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应。
本发明提供一种并发处理API请求的方法及***,该方法通过结合协程和线程池机制,使用协程的方式由程序主动控制调度逻辑,避免由操作***随机调度导致的API请求执行乱序;协程非常轻量且切换开销低,线程池的规模恒定不会带来创建和销毁的负担;协程的切换机制能保证和在线程池中使用保序标识符确保对同一类资源的API请求进行处理不会乱序;协程使用的异步函数只有异步等待一个,不依赖与异步I/O库函数,直接实现对API请求的保序高并发处理。
附图说明
图1为本发明实施例提供的并发处理API请求的方法整体流程示意图;
图2为本发明实施例提供的并发处理API请求的***整体结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
在本发明的一个实施例中提供一种并发处理API请求的方法,图1为本发明实施例提供的并发处理API请求的方法整体流程示意图,该方法包括:S1,若当前API请求对应的当前任务包括I/O操作,则使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程是在主线程中为所述当前API请求预先创建的;S2,当所述当前服务协程异步等待时间达到预设时长时,将所述主线程的调度逻辑切换到满足预设条件的其他服务协程,获取所述其他服务协程生成其他API请求对应的其他任务的第二三元组;S3,根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;S4,使用预先创建的任务处理线程对所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应。
具体地,S1中,所述当前API请求为主线程当前接收到的API请求。所述当前API请求对应的当前任务是指为了获取到所述当前API请求的API,需要执行的任务。判断所述当前API请求对应的当前任务是否包括I/O操作,所述I/O操作包括文件读写、数据库读写、网络读写等。若包括I/O操作,则使用当前服务协程生成所述当前任务的第一三元组,所述第一三元组为<当前任务F,请求结果队列Q,保序标识符O>。所述请求结果队列用于保存所述当前API的请求结果。所述保序标识符用于区分不同类别的API请求,同一类别的API请求的保序标识符相同。所述当前服务协程是在主线程中为所述当前API请求预先创建的。
S2中,当所述当前服务协程异步等待时间达到预设时长时,如等待一个较小的时间片t,使用异步等待机制将所述主线程的调度逻辑切换到满足预设条件的其他服务协程。从而实现对API请求的异步处理。所述其他服务协程为除所述当前服务协程以外的其他服务协程。获取所述其他服务协程生成其他API请求对应的其他任务的第二三元组。所述其他API请求为除所述当前API请求以外的其他API请求。所述其他任务为除所述当前任务以外的其他任务。
S3中,根据所述第一三元组中当前任务的保序标识符,使用预先创建的调度线程将所述当前任务分配到相应的等待队列中;根据所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述其他任务分配到等待队列中。由于所述保序标识符用于区分不同类别的API请求,从而根据所述保序标识符将不同类别的当前任务和其他任务分配到不同的等待队列中。
S4中,为所述每个等待队列预先创建一个任务处理线程,所述任务处理线程与所述等待队列一一对应。一个任务处理线程对一个等待队列中的当前任务和其他任务进行处理,将对所述当前任务的处理处理结果保存到所述第一三元组的请求结果队列中,将对所述其他任务的处理结果保存到所述第二三元组的请求结果队列中。
例如,在API服务进程启动,创建1个调度线程、16个等待队列中和16个任务处理线程。假设所述当前API请求对应的当前任务中含有I/O操作,且是第一个API请求。由服务协程生成三元组,并将所述三元组加入所述调度队列中。所述当前API请求的API为网卡IP地址配置API,由服务协程C1处理,将其保序标识符O设置为网卡的名字。所述服务协程C1异步等待一个很小的时间片t,异步等待机制会将主线程的调度逻辑切换到其它协程,从而实现对API请求的并发处理。此时,所述主线程接收到其他请求,如主机DNS配置API请求,将会生成服务协程C2进行处理,其保序标识符O设为字符串“DNS”。所述调度线程从所述调度队列中依次获取所述当前任务和其他任务的三元组<F,Q,O>,并根据O将所述当前任务和其他任务分配到某个等待队列。本例中由于C1和C2的保序标识符不同,二者被分配到不同的等待队列中,由不同的处理线程并行处理。
本实施例通过结合协程和线程池机制,使用协程的方式由程序主动控制调度逻辑,避免由操作***随机调度导致的API请求执行乱序;协程非常轻量且切换开销低,线程池的规模恒定不会带来创建和销毁的负担;协程的切换机制能保证和在线程池中使用保序标识符确保对同一类资源的API请求进行处理不会乱序;协程使用的异步函数只有异步等待一个,不依赖与异步I/O库函数,直接实现对API请求的保序高并发处理。
在上述实施例的基础上,本实施例中所述步骤S1之前还包括:在API服务启动时,创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程;当当前API请求到达主线程时,在所述主线程中为所述当前API请求创建一个当前服务协程。
具体地,在API服务启动时,创建多个线程以实现对API请求的保序高并发处理。创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程。所述调度线程用于将主线程接收的API请求对应的任务分配到合适的预设数量的请求等待队列中。所述任务包括当前任务和其他任务。所述任务处理线程用于处理对应的请求等待队列中的任务。一个任务处理线程处理一个请求等待队列中的任务。主线程等待并接收下一个API请求,当所述当前API请求到达时,在主线程中为所述API请求生成一个协程,记为当前服务协程C。
在上述实施例的基础上,本实施例中所述步骤S1还包括:若所述当前API请求对应的所述当前任务不包括I/O操作,则使用所述当前服务协程执行所述当前任务。
在上述各实施例的基础上,本实施例中所述第一三元组包括所述当前任务、所述当前API请求的请求结果队列和所述当前任务的保序标识符;所述第二三元组包括所述其他任务、所述其他API请求的请求结果队列和所述其他任务的保序标识符。
在上述各实施例的基础上,本实施例中所述步骤S2具体包括:计算各所述其他服务协程的剩余等待时长;将所述主线程的调度逻辑切换到所述剩余等待时长最短的所述其他服务协程。
具体地,所述剩余等待时长通过所述其他服务协程的预设等待总时长减去已经等待的时长。
在上述各实施例的基础上,本实施例中所述步骤S2具体包括:每隔所述预设时长使用所述当前服务协程检测所述第一三元组中的请求结果队列;若所述第一三元组中的请求结果队列中有结果,则返回所述请求结果队列中的API,终止所述当前服务协程;或者若所述第一三元组中的请求结果队列中没有结果,则所述当前服务协程继续等待。
在上述各实施例的基础上,本实施例中所述步骤S2还包括:分别计算所述主线程中各其他服务协程和请求协程的剩余等待时长,所述请求协程用于接收API请求;若所述剩余等待时长最短的协程为所述请求协程,则使用所述请求协程等待并接收下一个API请求。
具体地,所述主线程中包含一个用于接收API请求的请求协程和M个正在处理API请求的服务协程,所述服务协程包括当前服务协程和其他服务协程。分别计算所述主线程中各其他服务协程和请求协程的剩余等待时长。使用主线程从中挑选一个剩余等待时长最短的协程。若所述剩余等待时长最短的协程为所述请求协程,则使用所述请求协程等待并接收下一个API请求。
在上述各实施例的基础上,本实施例中所述步骤S2之后还包括:将所述第一三元组和所述第二三元组保存到调度队列中;相应地,所述步骤S3具体包括:使用所述调度线程依次从所述调度队列中获取所述第一三元组和所述第二三元组中的保序标识符。
在上述各实施例的基础上,本实施例中所述步骤S3具体包括:若所述等待队列中存在所述第一三元组和/或所述第二三元组中保序标识符的第一任务,则将与所述第一任务的保序标识符相同的当前任务或其他任务分配到所述第一任务所在的等待队列中;或者,若预先创建的任务处理线程正在处理所述第一三元组和/或所述第二三元组中保序标识符的第二任务,则将与所述第二任务的保序标识符相同的当前任务或其他任务分配到所述第二任务所在的等待队列中;或者,若所述等待队列中不存在所述第一任务且所述任务处理线程没有正在处理所述第二任务,则将所述当前任务和其他任务分配到长度最小的所述等待队列中。
在本发明的另一个实施例中提供一种并发处理API请求的***,图2为本发明实施例提供的并发处理API请求的***整体结构示意图,该***包括生成单元1、切换单元2、分配单元3和处理单元4,其中:
所述生成单元1用于在当前API请求对应的当前任务包括I/O操作时,使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程为在主线程中预先为所述当前API请求创建的;所述切换单元2用于当所述当前服务协程异步等待时间达到预设时长时,使用异步等待机制将所述主线程的调度逻辑切换到其他服务协程,获取其他服务协程生成其他API请求对应的其他任务的第二三元组;所述分配单元3用于根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;所述处理单元4用于使用预先创建的任务处理线程对对应的所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应。
具体地,所述当前API请求为主线程当前接收到的API请求。所述当前API请求对应的当前任务是指为了获取到所述当前API请求的API,需要执行的任务。判断所述当前API请求对应的当前任务是否包括I/O操作,所述I/O操作包括文件读写、数据库读写、网络读写等。若包括I/O操作,则所述生成单元1使用当前服务协程生成所述当前任务的第一三元组,所述第一三元组为<当前任务F,请求结果队列Q,保序标识符O>。所述请求结果队列用于保存所述当前API的请求结果。所述保序标识符用于区分不同类别的API请求,同一类别的API请求的保序标识符相同。所述当前服务协程是在主线程中为所述当前API请求预先创建的。
当所述当前服务协程异步等待时间达到预设时长时,如等待一个较小的时间片t,所述切换单元2使用异步等待机制将所述主线程的调度逻辑切换到满足预设条件的其他服务协程。从而实现对API请求的异步处理。所述其他服务协程为除所述当前服务协程以外的其他服务协程。获取所述其他服务协程生成其他API请求对应的其他任务的第二三元组。所述其他API请求为除所述当前API请求以外的其他API请求。所述其他任务为除所述当前任务以外的其他任务。
所述分配单元3根据所述第一三元组中当前任务的保序标识符,使用预先创建的调度线程将所述当前任务分配到相应的等待队列中;根据所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述其他任务分配到等待队列中。由于所述保序标识符用于区分不同类别的API请求,从而根据所述保序标识符将不同类别的当前任务和其他任务分配到不同的等待队列中。
为所述每个等待队列预先创建一个任务处理线程,所述任务处理线程与所述等待队列一一对应。所述处理单元4使用一个任务处理线程对一个等待队列中的当前任务和其他任务进行处理,将对所述当前任务的处理处理结果保存到所述第一三元组的请求结果队列中,将对所述其他任务的处理结果保存到所述第二三元组的请求结果队列中。
本实施例通过结合协程和线程池机制,使用协程的方式由程序主动控制调度逻辑,避免由操作***随机调度导致的API请求执行乱序;协程非常轻量且切换开销低,线程池的规模恒定不会带来创建和销毁的负担;协程的切换机制能保证和在线程池中使用保序标识符确保对同一类资源的API请求进行处理不会乱序;协程使用的异步函数只有异步等待一个,不依赖与异步I/O库函数,直接实现对API请求的保序高并发处理。
在上述实施例的基础上,本实施例中所述***还包括创建单元,用于在API服务启动时,创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程;当当前API请求到达主线程时,在所述主线程中为所述当前API请求创建一个当前服务协程。
在上述实施例的基础上,本实施例中所述生成单元还用于:在所述当前API请求对应的所述当前任务不包括I/O操作时,使用所述当前服务协程执行所述当前任务。
在上述各实施例的基础上,本实施例中所述第一三元组包括所述当前任务、所述当前API请求的请求结果队列和所述当前任务的保序标识符;所述第二三元组包括所述其他任务、所述其他API请求的请求结果队列和所述其他任务的保序标识符。
在上述各实施例的基础上,本实施例中所述切换单元具体用于:计算各所述其他服务协程的剩余等待时长;将所述主线程的调度逻辑切换到所述剩余等待时长最短的所述其他服务协程。
在上述各实施例的基础上,本实施例中所述切换单元具体用于:每隔所述预设时长使用所述当前服务协程检测所述第一三元组中的请求结果队列;若所述第一三元组中的请求结果队列中有结果,则返回所述请求结果队列中的API,终止所述当前服务协程;或者若所述第一三元组中的请求结果队列中没有结果,则所述当前服务协程继续等待。
在上述各实施例的基础上,本实施例中所述切换单元还用于:分别计算所述主线程中各其他服务协程和请求协程的剩余等待时长,所述请求协程用于接收API请求;若所述剩余等待时长最短的协程为所述请求协程,则使用所述请求协程等待并接收下一个API请求。
在上述各实施例的基础上,本实施例中所述***还包括保存单元,用于将所述第一三元组和所述第二三元组保存到调度队列中;相应地,所述分配单元具体用于使用所述调度线程依次从所述调度队列中获取所述第一三元组和所述第二三元组中的保序标识符。
在上述各实施例的基础上,本实施例中所述分配单元具体用于:在所述等待队列中存在所述第一三元组和/或所述第二三元组中保序标识符的第一任务时,将与所述第一任务的保序标识符相同的当前任务或其他任务分配到所述第一任务所在的等待队列中;或者,在预先创建的任务处理线程正在处理所述第一三元组和/或所述第二三元组中保序标识符的第二任务时,将与所述第二任务的保序标识符相同的当前任务或其他任务分配到所述第二任务所在的等待队列中;或者,在所述等待队列中不存在所述第一任务且所述任务处理线程没有正在处理所述第二任务时,将所述当前任务和其他任务分配到长度最小的所述等待队列中。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种并发处理API请求的方法,其特征在于,包括:
S1,若当前API请求对应的当前任务包括I/O操作,则使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程是在主线程中为所述当前API请求预先创建的;
S2,当所述当前服务协程异步等待时间达到预设时长时,将所述主线程的调度逻辑切换到满足预设条件的其他服务协程,获取所述其他服务协程生成其他API请求对应的其他任务的第二三元组;
S3,根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;
S4,使用预先创建的任务处理线程对所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应;
所述步骤S1之前还包括:
在API服务启动时,创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程;
当当前API请求到达主线程时,在所述主线程中为所述当前API请求创建一个当前服务协程。
2.根据权利要求1所述的方法,其特征在于,所述步骤S1还包括:
若所述当前API请求对应的所述当前任务不包括I/O操作,则使用所述当前服务协程执行所述当前任务。
3.根据权利要求1或2所述的方法,其特征在于,所述第一三元组包括所述当前任务、所述当前API请求的请求结果队列和所述当前任务的保序标识符;
所述第二三元组包括所述其他任务、所述其他API请求的请求结果队列和所述其他任务的保序标识符。
4.根据权利要求1或2所述的方法,其特征在于,所述步骤S2具体包括:
计算各所述其他服务协程的剩余等待时长;
将所述主线程的调度逻辑切换到所述剩余等待时长最短的所述其他服务协程。
5.根据权利要求1或2所述的方法,其特征在于,所述步骤S2具体包括:
每隔所述预设时长使用所述当前服务协程检测所述第一三元组中的请求结果队列;
若所述第一三元组中的请求结果队列中有结果,则返回所述请求结果队列中的API,终止所述当前服务协程;或者
若所述第一三元组中的请求结果队列中没有结果,则所述当前服务协程继续等待。
6.根据权利要求1或2所述的方法,其特征在于,所述步骤S2还包括:
分别计算所述主线程中各其他服务协程和请求协程的剩余等待时长,所述请求协程用于接收API请求;
若所述剩余等待时长最短的协程为所述请求协程,则使用所述请求协程等待并接收下一个API请求。
7.根据权利要求1或2所述的方法,其特征在于,所述步骤S2之后还包括:
将所述第一三元组和所述第二三元组保存到调度队列中;
相应地,所述步骤S3具体包括:
使用所述调度线程依次从所述调度队列中获取所述第一三元组和所述第二三元组中的保序标识符。
8.根据权利要求1或2所述的方法,其特征在于,所述步骤S3具体包括:
若所述等待队列中存在所述第一三元组和/或所述第二三元组中保序标识符的第一任务,则将与所述第一任务的保序标识符相同的当前任务或其他任务分配到所述第一任务所在的等待队列中;或者,
若预先创建的任务处理线程正在处理所述第一三元组和/或所述第二三元组中保序标识符的第二任务,则将与所述第二任务的保序标识符相同的当前任务或其他任务分配到所述第二任务所在的等待队列中;或者,
若所述等待队列中不存在所述第一任务且所述任务处理线程没有正在处理所述第二任务,则将所述当前任务和其他任务分配到长度最小的所述等待队列中。
9.一种并发处理API请求的***,其特征在于,包括:
生成单元,用于在当前API请求对应的当前任务包括I/O操作时,使用当前服务协程生成所述当前任务的第一三元组,所述当前服务协程为在主线程中预先为所述当前API请求创建的;
切换单元,用于当所述当前服务协程异步等待时间达到预设时长时,使用异步等待机制将所述主线程的调度逻辑切换到其他服务协程,获取其他服务协程生成其他API请求对应的其他任务的第二三元组;
分配单元,用于根据所述第一三元组中当前任务的保序标识符和所述第二三元组中其他任务的保序标识符,使用预先创建的调度线程将所述当前任务和所述其他任务分配到各等待队列中;
处理单元,用于使用预先创建的任务处理线程对对应的所述各等待队列中的当前任务和其他任务进行处理,将处理结果保存到所述第一三元组和所述第二三元组中的请求结果队列中,所述任务处理线程与所述等待队列一一对应;
还包括创建单元,用于在API服务启动时,创建一个调度线程、预设数量的等待队列和所述预设数量的任务处理线程;当当前API请求到达主线程时,在所述主线程中为所述当前API请求创建一个当前服务协程。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711395321.6A CN108089919B (zh) | 2017-12-21 | 2017-12-21 | 一种并发处理api请求的方法及*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711395321.6A CN108089919B (zh) | 2017-12-21 | 2017-12-21 | 一种并发处理api请求的方法及*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108089919A CN108089919A (zh) | 2018-05-29 |
CN108089919B true CN108089919B (zh) | 2021-01-15 |
Family
ID=62178035
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711395321.6A Active CN108089919B (zh) | 2017-12-21 | 2017-12-21 | 一种并发处理api请求的方法及*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108089919B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110990667B (zh) * | 2019-10-29 | 2023-06-23 | 内蒙古大学 | 一种基于协程技术的多端大学生电子档案管理*** |
CN114924849B (zh) * | 2022-04-27 | 2024-06-04 | 上海交通大学 | 一种工业控制***高并发执行和资源调度方法及装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6152612A (en) * | 1997-06-09 | 2000-11-28 | Synopsys, Inc. | System and method for system level and circuit level modeling and design simulation using C++ |
CN102099826A (zh) * | 2008-07-14 | 2011-06-15 | 微软公司 | 用于可扩展化身***的编程api |
CN104142858A (zh) * | 2013-11-29 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 阻塞任务调度方法及装置 |
CN105159774A (zh) * | 2015-07-08 | 2015-12-16 | 清华大学 | 一种api请求保序处理方法及*** |
CN106980546A (zh) * | 2016-01-18 | 2017-07-25 | 阿里巴巴集团控股有限公司 | 一种任务异步执行方法、装置及*** |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8589925B2 (en) * | 2007-10-25 | 2013-11-19 | Microsoft Corporation | Techniques for switching threads within routines |
-
2017
- 2017-12-21 CN CN201711395321.6A patent/CN108089919B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6152612A (en) * | 1997-06-09 | 2000-11-28 | Synopsys, Inc. | System and method for system level and circuit level modeling and design simulation using C++ |
CN102099826A (zh) * | 2008-07-14 | 2011-06-15 | 微软公司 | 用于可扩展化身***的编程api |
CN104142858A (zh) * | 2013-11-29 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 阻塞任务调度方法及装置 |
CN105159774A (zh) * | 2015-07-08 | 2015-12-16 | 清华大学 | 一种api请求保序处理方法及*** |
CN106980546A (zh) * | 2016-01-18 | 2017-07-25 | 阿里巴巴集团控股有限公司 | 一种任务异步执行方法、装置及*** |
Non-Patent Citations (1)
Title |
---|
"基于协程的高并发的分析与研究";刘书健;《中国优秀硕士学位论文全文数据库 信息科技辑》;20170215(第02期);第I138-1416页 * |
Also Published As
Publication number | Publication date |
---|---|
CN108089919A (zh) | 2018-05-29 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10891158B2 (en) | Task scheduling method and apparatus | |
US10003500B2 (en) | Systems and methods for resource sharing between two resource allocation systems | |
CN112486648A (zh) | 任务调度方法、装置、***、电子设备和存储介质 | |
US7316017B1 (en) | System and method for allocatiing communications to processors and rescheduling processes in a multiprocessor system | |
US8695004B2 (en) | Method for distributing computing time in a computer system | |
US9448864B2 (en) | Method and apparatus for processing message between processors | |
CN103150213B (zh) | 负载平衡方法和装置 | |
US20090165003A1 (en) | System and method for allocating communications to processors and rescheduling processes in a multiprocessor system | |
KR101638136B1 (ko) | 멀티 스레드 구조에서 작업 분배 시 스레드 간 락 경쟁을 최소화하는 방법 및 이를 사용한 장치 | |
US10686728B2 (en) | Systems and methods for allocating computing resources in distributed computing | |
CN110187958B (zh) | 一种任务处理方法、装置、***、设备及存储介质 | |
KR20150114444A (ko) | 실시간 운영 체제에서 스택 메모리 관리를 제공하는 방법 및 시스템 | |
JP2008186136A (ja) | 計算機システム | |
US9047121B2 (en) | System and method for scheduling jobs in a multi-core processor | |
CN108089919B (zh) | 一种并发处理api请求的方法及*** | |
Reano et al. | Intra-node memory safe gpu co-scheduling | |
CN113032125A (zh) | 作业调度方法、装置、计算机***和计算机可读存储介质 | |
RU2494446C2 (ru) | Восстановление управления ресурсом обработки, который исполняет внешний контекст исполнения | |
CN115495262A (zh) | 一种微内核操作***及进程间消息的处理方法 | |
CN111651279A (zh) | 一种处理业务流程的方法及其处理*** | |
WO2021212967A1 (en) | Task scheduling for distributed data processing | |
CN111290842A (zh) | 一种任务执行方法和装置 | |
CN115408117A (zh) | 协程运行方法、装置、计算机设备和存储介质 | |
US10303523B2 (en) | Method and apparatus to migrate stacks for thread execution | |
JP2015141584A (ja) | 情報処理装置、情報処理方法およびプログラム |
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 |