CN110955503B - 任务调度方法及装置 - Google Patents
任务调度方法及装置 Download PDFInfo
- Publication number
- CN110955503B CN110955503B CN201811130901.7A CN201811130901A CN110955503B CN 110955503 B CN110955503 B CN 110955503B CN 201811130901 A CN201811130901 A CN 201811130901A CN 110955503 B CN110955503 B CN 110955503B
- Authority
- CN
- China
- Prior art keywords
- task
- code data
- tasks
- coroutine
- execution
- 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
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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本公开揭示了一种任务调度方法及装置,包括:获取多线程代码数据进行程序语法转换所得到的协程代码数据,多线程代码数据用于多线程并行执行多个任务;将多个任务添加至调度器中;通过调度器根据协程代码数据调度控制多个任务在单线程中的切换执行。通过将多线程代码数据进行程序语法转换得到协程代码数据,并利用调度器根据协程代码数据调度控制多个任务在单线程中的切换执行,实现了在单线程中运行多线程代码数据,解决了现有技术中在浏览器中运行通用编程语言的困难。
Description
技术领域
本公开涉及计算机技术领域,特别涉及一种任务调度方法及装置。
背景技术
浏览器已经成为一个重要的编程平台。现有技术中,通过JavaScript语言编写的代码数据可以直接在浏览器中运行,从而,为了实现在浏览器中运行各种编程语言编写的代码数据,可以通过将其他编程语言所编写的代码数据编译为JavaScript语言的代码数据之后在浏览器中运行。
但是,JavaScript语言的代码数据在浏览器中的运行是单线程运行的。如果其他编程语言所编写的代码不支持以单线程方式运行,例如利用Python编写的多线程代码数据,那么编译为JavaScript语言之后的多线程代码数据也是不能在浏览器中运行的。因而利用Python编写的多线程代码数据不能在浏览器中运行。现有技术中很多通用编程语言例如C、C++、Python所编写的代码数据为多线程代码数据,从而在浏览器中运行通用编程语言受到限制。
由上可知,如何在单线程中运行多线程代码数据的问题还有待解决。
发明内容
为了解决相关技术中存在的问题,本公开提供了一种任务调度方法及装置。
一种任务调度方法,包括:
获取多线程代码数据进行程序语法转换所得到的协程代码数据,所述多线程代码数据用于多线程并行执行多个任务;
将所述多个任务添加至调度器中;
通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行。
一种任务调度装置,包括:
获取模块,被配置为执行:获取多线程代码数据进行程序语法转换所得到的协程代码数据,所述多线程代码数据用于多线程并行执行多个任务;
添加模块,被配置为执行:将所述多个任务添加至调度器中;
调度控制模块,被配置为执行:通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行。
在一示例性实施例中,所述多线程代码数据包括用于多线程并行执行多个任务的任务函数,所述任务调度装置还包括:
静态分析模块,被配置为执行:对所述多线程代码数据进行静态分析,通过所述静态分析确定所述多线程代码数据中每一任务函数所对应的类型;
协程关键字添加模块,被配置为执行:根据所述每一任务函数所对应的类型,在所述任务函数中添加对应的协程关键字,得到所述协程代码数据;其中,在所协程代码数据运行于所述单线程的过程中,所述调度器通过所述协程关键字进行所述任务函数所对应任务在所述单线程中不同任务队列之间的切换,实现所述多个任务的切换执行。
在一示例性实施例中,所述任务队列包括存放当前所执行任务的执行队列、存放被阻塞任务的阻塞队列和存放待执行任务的准备队列,所述调度控制模块包括:
阻塞判断单元,被配置为执行:在所述协程代码数据运行于所述单线程的过程中,根据所述协程关键字判断位于所述执行队列中的任务是否被阻塞;
调度切换单元,被配置为执行:如果所述位于执行队列中的任务被阻塞,暂停执行位于所述执行队列中被阻塞的任务,通过所述调度器将所述被阻塞的任务移至阻塞队列,并将位于所述准备队列中的任务移至所述执行队列,以执行被移至所述执行队列中的任务。
在一示例性实施例中,所述装置还包括:
第一监控模块,被配置为执行:对位于所述阻塞队列中的任务进行监控;
第一转移模块,被配置为执行:如果监控到造成所述位于所述阻塞队列中任务阻塞的阻塞条件消除,则通过所述调度器将位于所述阻塞队列中的任务移至所述准备队列中,以等待恢复执行所述被阻塞的任务。
在一示例性实施例中,所述装置还包括:
分配模块,被配置为执行:根据所述协程代码数据中所述多个任务的初始执行顺序,将所述多个任务中初始执行的任务分配至所述执行队列中,将所述多个任务中的其它任务分配至所述准备队列中。
在一示例性实施例中,所述调度控制模块还包括:
监控单元,被配置为执行:对位于所述执行队列中的任务进行执行状态监控;
转移单元,被配置为执行:如果监控到所述执行队列中的任务执行完成,则通过所述调度器将执行完成的任务从所述执行队列中移除,并将位于准备队列中的任务移至所述执行队列,以执行被移至所述执行队列中的任务。
在一示例性实施例中,所述装置还包括:
编译模块,被配置为执行:对所述协程代码数据进行编译,以满足所述单线程所在运行环境对所运行代码数据的程序语言要求;
所述调度控制模块包括:
调度控制单元,被配置为执行:通过所述调度器根据编译后的所述协程代码数据调度控制所述多个任务在所述运行环境的单线程中的切换执行。
一种任务调度装置,包括:
处理器;及
存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如上所述的任务调度方法。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上所述的任务调度方法。
在本公开的技术方案中,通过将多线程代码数据进行程序语法转换得到协程代码数据,并利用调度器根据协程代码数据调度控制多个任务在单线程中的切换执行,实现了在单线程中运行多线程代码数据,解决了现有技术中在浏览器中运行通用编程语言的困难。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性的,并不能限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本发明的实施例,并于说明书一起用于解释本发明的原理。
图1是本公开所涉及的实施环境的示意图;
图2是根据一示例性实施例示出的一种服务器的框图;
图3是根据一示例性实施例示出的一种任务调度方法的流程图;
图4是图3所述实施例中步骤S110之前步骤的流程图;
图5是图3对应实施例的步骤S150的流程图;
图6是根据一示例性实施例示出的图5对应实施例的步骤S151之后步骤的流程图;
图7是根据另一示例性实施例示出的图3对应实施例的步骤S150的流程图;
图8是根据另一示例性实施例示出的任务调度方法的流程图;
图9是根据一示例性实施例示出的任务调度装置的框图;
图10是根据另一示例性实施例示出的任务调度装置的框图。
具体实施方式
这里将详细地对示例性实施例执行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的装置和方法的例子。
图1是根据一示例性实施示出的本公开所涉及的实施环境的示意图。该实施环境包括:服务器200和至少一终端100(图1中仅示出两个)。
其中,终端100可以是手提电脑、台式电脑等、智能手机等可以运行应用程序客户端的电子设备。服务器200为终端100上所运行客户端所对应的服务器,用于与终端100上所运行的应用程序客户端进行数据交换,从而为应用程序客户端提供对应的服务,例如在终端的客户端上编写代码数据,服务器将终端中所编写的代码数据按照本公开的技术方案进行代码数据中多个任务的切换运行,并将运行结果返回到终端100,或者在运行过程中将运行过程反馈到终端100,由终端100向用户展示运行过程。
终端100和服务器200之间建立网络连接实现通信,二者之间的关联方式包括硬件的网络关联方式和/或协议,以及二者之间往来的数据关联方式。
图2是根据一示例性实施例示出的一种服务器200的框图,该服务器200可以用于按照本公开的方法进行实现任务调度。
需要说明的是,该服务器只是一个适配于本公开的示例,不能认为是提供了对本公开使用范围的任何限制。该服务器也不能解释为需要依赖于或者必须具有图2中示出的示例性的服务器200中的一个或者多个组件。
该服务器的硬件结构可因配置或者性能的不同而产生较大的差异,如图2所示,服务器200包括:电源210、接口230、至少一存储器250、以及至少一中央处理器(CPU,CentralProcessing Units)270。
其中,电源210用于为服务器200上的各硬件设备提供工作电压。
接口230包括至少一有线或无线网络接口231、至少一串并转换接口233、至少一输入输出接口235以及至少一USB接口237等,用于与外部设备通信。
存储器250作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,其上所存储的资源包括操作系统251、应用程序253及数据255等,存储方式可以是短暂存储或者永久存储。其中,操作系统251用于管理与控制服务器200上的各硬件设备以及应用程序253,以实现中央处理器270对海量数据255的计算与处理,其可以是WindowsServerTM、Mac OS XTM、UnixTM、LinuxTM、FreeBSDTM等。应用程序253是基于操作系统251之上完成至少一项特定工作的计算机程序,其可以包括至少一模块(图2中未示出),每个模块都可以分别包含有对服务器200的一系列计算机可读指令。数据255可以是存储于磁盘中的代码数据等。
中央处理器270可以包括一个或多个以上的处理器,并设置为通过总线与存储器250通信,用于运算与处理存储器250中的海量数据255。
如上面所详细描述的,适用本公开的服务器200将通过中央处理器270读取存储器250中存储的一系列计算机可读指令的形式来完成任务调度方法。
在示例性实施例中,服务器200可以被一个或多个应用专用集成电路(Application Specific Integrated Circuit,简称ASIC)、数字信号处理器、数字信号处理设备、可编程逻辑器件、现场可编程门阵列、控制器、微控制器、微处理器或其他电子元件实现,用于执行下述方法。因此,实现本发明并不限于任何特定硬件电路、软件以及两者的组合。
图3是根据一示例性实施例示出的一种任务调度方法的流程图。该任务调度方法用于图1所示实施环境的终端100中。如图3所示,该任务调度方法,包括:
步骤S110,获取多线程代码数据进行程序语法转换所得到的协程代码数据,多线程代码数据用于多线程并行执行多个任务。
在进行具体论述之前,通过分别按照协程、多线程、以及单线程的方式进行多个任务的执行来对三者之间的区别进行说明:
例如所要执行的任务是任务A和任务B,按照理想状态,两个任务都是运算操作,没有竞争和数据共享的问题。
在以多线程方式执行该两个任务时,由线程A执行任务A,由线程B执行任务B,从而实现任务A和任务B的并行执行。
在以单线程方式执行该两个任务时,按照代码数据中所设定的任务执行顺序,例如先执行任务A再执行任务B,那么,在执行过程中,任务A执行完成之后才能执行任务B。
在以协程方式执行该两个任务时,可以先执行任务A再执行任务B,其中如果任务A被阻塞,则可以暂停执行任务A,切换为先执行任务B,然后再恢复执行任务A。也可以认为是协程与协程之间的让渡,即协程A执行任务A,协程B执行任务B,但是同一时间仅有一个协程中的任务执行。
由上可知,在多线程中,多个任务可以并行执行(即同一时间可以执行多个任务)。在单线程中,多个任务顺序执行,即同一时间只能执行一个任务,且上一任务完成之后才能开始执行下一任务。在协程中,也是同一时间仅有一个任务在执行,但是任务之间的执行顺序可以进行切换。
另外,值得说明的是,多线程中,线程之间也是可以进行切换的,例如线程I中需要执行C、D两个任务,线程II暂时没有需要处理的任务,则在执行过程中,可以将线程I中的任务例如任务C,切换到线程II中执行,即相当于线程I执行任务D,线程II执行任务C。其中线程之间的调度由操作系统来实现调度,而协程中任务的调度由对应的代码数据进行调度,例如利用协程代码数据中的yield等协程关键字进行任务让渡。从而线程之间切换的成本大于协程切换的成本,且线程切换的速度比协程切换的速度慢。
而本公开的技术方案所实现的在单线程中实现多线程代码数据中多个任务的切换执行是以协程的方式进行切换,即通过代码数据自身实现切换。
多线程代码数据是指按照多线程方式运行的代码数据,其中代码数据是否为多线程代码数据受限于该代码数据的编程语言,例如,如果编程语言的函数库中提供对应的用于多线程执行代码数据的线程库,以支持代码数据的多线程操作、应用,那么利用该编程语言中的线程库所编制的代码即为多线程代码数据,从而在支持该种编程语言运行的环境中,该多线程代码数据可以按照多线程的方式运行。C、C++、Python等编程语言均支持多线程方式运行,在此不对多线程代码数据的具体编程语言进行限定。
协程代码数据是指以协程方式运行的代码数据,即上文提到的,在以协程方式运行时,协程代码数据中所要执行的多个任务可以切换执行,但是同一时间仅有一个任务执行。同理,协程代码数据也是受限于编程语言的,即编程语言中是否提供代码数据以协程方式执行的协程相关函数,例如下文提到的协程关键字等,那么利用该编程语言中的协程相关函数所编写的代码数据即为协程代码数据。在本公开的技术方案中,通过对多线程代码数据进行静态分析,并在任务函数中添加对应的协程关键字,从而使多线程代码数据转换为协程代码数据。
不同编程语言所编制的代码数据以何种方式(即上文提到的单线程、多线程、以及协程)运行一方面受限于代码数据的实际运行环境,即实际的运行环境是否执行对应的运行方式,另一方面受限于编程语言,即编程语言是否提供对应运行方式的函数库以及接口等。例如用JavaScript所编写的代码数据在浏览器中运行时仅能以单线程方式运行,用Python、C、C++等编程语言所编制的代码数据即支持多线程方式运行,也支持协程方式运行,比如用Python以及Python所提供的多线程相关函数编写代码数据即支持以多线程方式运行,用Python以及Python所支持的协程相关函数编写的代码数据即支持以协程方式运行。
当然,在将多线程代码数据进行程序语法转换得到协程代码数据后,协程代码数据运行时所执行的任务也是所对应多线程代码数据所要执行的多个任务。
在一具体实施例中,可以在终端的客户端上编写多线程代码数据,服务器从终端中获取该多线程代码数据并将多线程代码数据进行程序语法转换得到协程代码数据,从而服务器直接将所得到的协程代码数据按照本公开的任务调度方法执行。当然,通过多线程代码数据进行程序语法转换所得到的协程代码数据也是可以直接存储于服务器中,从而服务器可以直接提取协程代码数据按照本公开的任务调度方法进行执行。
步骤S130,将多个任务添加至调度器中。
调度器用于调度代码数据按照协程方式执行代码数据中的多个任务,即调度器是支持以协程方式执行多个任务的协程调度器。在一种编程语言中,如果通过该编程语言提供协程相关函数供用户编写协程代码数据,那么该编程语言中也提供进行协程代码数据中多个任务以协程方式执行的协程调度器。
其中,将多个任务添加至调度器中即将该多个任务所对应的任务函数添加至协程调度器中,从而,调度器可以按照步骤S150的步骤进行多个任务的调度。
在一实施例中,如果多线程代码数据所使用的编程语言不支持编写协程的代码数据,那么需要先将多线程代码数据编译到其他支持编写协程代码数据的语言,即将多线程代码数据编译为另一编程语言的多线程代码数据,然后根据编译后的多线程代码数据进行程序语法转换,得到协程代码数据。从而在步骤S130中,将多线程代码数据所要执行的多个任务添加中支持协程的编程语言所提供的协程调度器中。
步骤S150,通过调度器根据协程代码数据调度控制多个任务在单线程中的切换执行。
即在步骤S150中,虽然协程代码数据是在单线程中运行,但是在执行过程中,调度器可以根据协程代码数据进行调度,实现多个任务在单线程中的切换执行。步骤S150中多个任务的切换执行详见下文描述。
在本公开的技术方案中,通过将多线程代码数据进行程序语法转换得到协程代码数据,并利用调度器根据协程代码数据调度控制多个任务在单线程中的切换执行,实现了在单线程中运行多线程代码数据,解决了现有技术中在浏览器中运行通用编程语言的困难。
本公开可以应用在编程软件中,特别是以浏览器作为平台的编程软件。从而在根据通用编程语言编写完成多线程代码数据之后,可以利用本公开的技术方案,将多线程代码数据运行于单线程中,例如将由多线程代码数据进行程序语法变换得到协程代码数据,并将协程代码数据编译为JavaScript语言,从而实现在浏览器中的运行。
在一示例性实施例中,多线程代码数据包括用于多线程并行执行多个任务的任务函数,如图4所示,在步骤S110之前还包括:
步骤S011,对多线程代码数据进行静态分析,通过静态分析确定多线程代码数据中每一任务函数所对应的类型。
静态分析是指在不运行多线程代码数据的方式下,通过词法分析、语法分析、控制流、数据流等技术对多线程代码数据进行扫描,从而确定多线程代码数据中每一任务函数所对应的类型。
其中进行多线程代码数据的静态分析可以利用静态分析工具,例如Findbugs、PMD、Checkstyle、BlueMorpho、Klocwork、LDRA Testbed、HP Fortify、Parasoft C++Test等,在此不进行具体限定。当然,静态分析工具对代码数据的编程语言有要求,例如Parasoft C++Test工具支持C、C++语言代码数据的静态分析,那么利用Python编写的代码数据就不能利用Parasoft C++Test工具进行代码数据的静态分析。所以,所使用的静态分析工具视该协程代码数据所使用的编程语言而定。
在代码数据运行过程中,任务的执行即执行该任务对应的任务函数,当然,任务函数中可以包括一个或者多个子函数,该一个或者多个子函数构成该任务函数。
通过静态分析可以判断某一任务函数所对应任务是否可能出现阻塞。其中造成任务阻塞可能是由于任务函数的推迟执行,例如包括time.sleep()推迟执行函数的任务函数,还可能是任务函数需要通过I/O接口从其他设备或者文件中读取数据,或者任务函数需要通过I/O接口向其他设备或者文件写数据,造成该任务函数对应的任务执行时间长,那么该任务函数即为阻塞函数。
步骤S013,根据每一任务函数所对应的类型,在任务函数中添加对应的协程关键字,得到协程代码数据;其中,在协程代码数据运行于单线程的过程中,调度器通过协程关键字进行任务函数所对应任务在单线程中不同任务队列之间的切换,实现多个任务的切换执行。
其中,所添加的协程关键字视编程语言和任务函数的类型而定,例如python语言中支持yield、await等,则在添加协程关键字的时候根据对应任务函数的类型添加yield或者await等,在此不进行具体限定。
举例来说,例如在多线程代码数据中,通过time.sleep(1000)推迟调用线程的运行,该函数为推迟执行函数,那么包含该函数的任务函数即为推迟执行函数,其中括号中的数字1000表示推迟时间,那么在进行静态分析确定该函数所在任务函数为推迟执行函数后,添加对应的协程关键字await得到协程代码数据:await time.sleep(1000),从而在协程代码数据运行到该函数所在任务函数时,即认为该任务函数所对应任务为可能被阻塞的任务,从而转移该任务函数所对应任务的任务队列,而执行另一个任务。
又比如,如果通过静态分析,确定多线程代码数据中的函数block()为阻塞函数,则在该函数添加对应的协程关键字yield,得到协程代码数据:yield block()。如果另一函数call_block调用到该阻塞函数block(),则该函数call_block也被视为阻塞函数,添加对应协程关键字yield,得到协程代码数据:yield call_block。从而在协程代码数据执行过程中,如果运行到协程关键字来判断该协程关键字所在任务函数所对应任务时,视为该任务被阻塞,则暂停该任务的运行,并切换执行其他的任务。
在不同编程语言中,所支持的协程关键字也不相同,例如在Python语言中,支持yield、await关键字,同时,不同类型的任务函数所添加的协程关键字也不相同,例如上文提到的针对推迟执行函数添加await协程关键字,针对阻塞函数添加yield协程关键字。当然,具体的编程语言中,还存在其他类型的任务函数、以及对应可添加的协程关键字,在此不进行具体限定。以上仅仅是示例性举例,并不能认为是对本公开使用范围的限制。
在一示例性实施例中,任务队列包括存放当前所执行任务的执行队列、存放被阻塞任务的阻塞队列和存放待执行任务的准备队列,图5所示,步骤S150包括:
步骤S151,在协程代码数据运行于单线程的过程中,根据协程关键字判断位于执行队列中的任务是否被阻塞。
步骤S153,如果位于执行队列中的任务被阻塞,暂停执行位于执行队列中被阻塞的任务,通过调度器将被阻塞的任务移至阻塞队列,并将位于准备队列中的任务移至执行队列,以执行被移至执行队列中的任务。
在协程代码数据的运行过程中,如果运行到包含协程关键字的任务函数所对应任务时,即认为该任务被阻塞,从而通过调度器将该任务从执行队列移至阻塞队列中,并将准备队列中等待执行的任务移至执行队列中,从而执行被移至执行队列中的任务,实现了多个任务的切换执行。
其中,准备队列中的任务可以是一个也可以是多个。针对准备队列中存在多个任务的情形,在一具体实施例中,按照将任务放进准备队列的顺序进行从准备队列中提取任务转移至执行队列中以执行该任务,即按照先进先出的顺序从准备队列中提取任务并转移至执行队列中以执行该任务。在另一具体实施例中,根据在准备队列中各个任务的优先级进行准备队列中任务的提取,即先提取优先级高的任务转移至执行队列中,以执行该优先级高的任务。
在一示例性实施例中,如图6所示,步骤S151之后,还包括:
步骤S161,对位于阻塞队列中的任务进行监控。
步骤S162,如果监控到造成位于阻塞队列中任务阻塞的阻塞条件消除,则通过调度器将位于阻塞队列中的任务移至准备队列中,以等待恢复执行被阻塞的任务。
被阻塞的任务被移至阻塞队列中之后,如果造成该任务被阻塞的条件消除,则重新将该任务从阻塞队列中移至准备队列中,以等待该任务被恢复执行。其中造成任务被阻塞的原因可能是某一任务在执行过程中调用另一任务,从而调度器将该任务移至阻塞队列中,而将被调用的任务移至执行队列中,以执行被调用的任务。那么,当被调用的任务执行完成或者出现异常,即视为造成该任务被阻塞的条件消除,从而将该任务重新从阻塞队列中移至准备队列,以等待该任务的恢复执行。
下面以包含yield协程关键字的任务函数所对应任务在不同任务队列之间的切换进行举例说明:
在协程代码数据的单线程运行过程中,包含yield协程关键字的函数使生成器执行暂停,如果运行到包含yield协程关键字的函数时,被暂停执行。yield协程关键字后面的表达式的值返回给生成器的调用者。其中yield协程关键字实际返回一个IteratorResult对象,该对象具有两个属性:value和done,其中value属性是对yield协程关键字所在表达式求值的结果,而done表示生成器函数尚未执行完成。
在执行过程中,一但遇到yield协程关键字,该包含yield协程关键字的函数即被暂停运行,调度器将该函数所在任务函数所对应任务移至阻塞队列,并执行从准备队列中移至执行队列的任务。
在生成器的next()被调用时,被暂停运行的函数将会恢复执行。其中,生成器的next()被调用,即为造成任务被阻塞的条件消除后,被阻塞的任务从准备队列中重新被移至执行队列中。当然,生成器的next()是否被调用,取决于造成任务阻塞的条件是否消除。
在一示例性实施例中,如图7所示,步骤S150包括:
步骤S251,对位于执行队列中的任务进行执行状态监控。
步骤S252,如果监控到执行队列中的任务执行完成,则通过调度器将执行完成的任务从执行队列中移除,并将位于准备队列中的任务移至执行队列,以执行被移至执行队列中的任务。
对于执行队列中已经执行完成的任务,将该任务从执行队列中移除,进而执行其他位于准备队列中待执行的任务。
在一示例性实施例中,步骤S151之前,还包括:
根据协程代码数据中多个任务的初始执行顺序,将多个任务中初始执行的任务分配至执行队列中,将多个任务中的其它任务分配至准备队列中。
在一示例性实施例中,如图8所示,步骤S150之前还包括:
对协程代码数据进行编译,以满足单线程所在运行环境对所运行代码数据的程序语言要求。
步骤S150包括:
步骤S250通过调度器根据编译后的协程代码数据调度控制多个任务在运行环境的单线程中的切换执行。
例如在上文提到的,为了实现在浏览器中运行代码数据,需要将该代码数据编译为JavaScript语言的代码数据。从而,为了满足协程代码数据在实际运行环境中的程序语言要求,需要将该协程代码数据进行编译,以实现该协程代码数据在实际单线程环境中的运行。
通过对协程代码数据进行编译,从而可以在运行环境中实现多种程序语言代码数据的运行,适用范围广。
下述为本公开装置实施例,可以用于执行本公开上述服务器200执行的任务调度方法实施例。对于本公开装置实施例中未披露的细节,请参照本公开任务调度方法实施例。
图9是根据一示例性实施例示出的一种任务调度装置的框图,该任务调度装置可以用于图1所示实施环境的服务器200中,执行以上方法实施例中任一所示的任务调度方法的全部或者部分步骤。如图9所示,该任务调度装置包括:
获取模块110,被配置为执行:获取多线程代码数据进行程序语法转换所得到的协程代码数据,多线程代码数据用于多线程并行执行多个任务。
添加模块130,该模块与获取模块110相连,被配置为执行:将多个任务添加至调度器中。
调度控制模块150,该模块与添加模块130相连,被配置为执行:通过调度器根据协程代码数据调度控制多个任务在单线程中的切换执行。
上述装置中各个模块的功能和作用的实现过程具体详见上述任务调度方法中对应步骤的实现过程,在此不再赘述。
在一示例性实施例中,多线程代码数据包括用于多线程并行执行多个任务的任务函数,任务调度装置还包括:
静态分析模块,被配置为执行:对多线程代码数据进行静态分析,通过静态分析确定多线程代码数据中每一任务函数所对应的类型。
协程关键字添加模块,被配置为执行:根据每一任务函数所对应的类型,在任务函数中添加对应的协程关键字,得到协程代码数据;其中,在所协程代码数据运行于单线程的过程中,调度器通过协程关键字进行任务函数所对应任务在单线程中不同任务队列之间的切换,实现多个任务的切换执行。
通过静态分析模块和协程关键字添加模块执行对应的操作之后,获取模块110可以直接获取对应的协程代码数据。
在一示例性实施例中,任务队列包括存放当前所执行任务的执行队列、存放被阻塞任务的阻塞队列和存放待执行任务的准备队列,调度控制模块包括:
阻塞判断单元,被配置为执行:在协程代码数据运行于单线程的过程中,根据协程关键字判断位于执行队列中的任务是否被阻塞。
调度切换单元,被配置为执行:如果位于执行队列中的任务被阻塞,暂停执行位于执行队列中被阻塞的任务,通过调度器将被阻塞的任务移至阻塞队列,并将位于准备队列中的任务移至执行队列,以执行被移至执行队列中的任务。
在一示例性实施例中,任务调度装置还包括:
第一监控模块,被配置为执行:对位于阻塞队列中的任务进行监控。
第一转移模块,被配置为执行:如果监控到造成位于阻塞队列中任务阻塞的阻塞条件消除,则通过调度器将位于阻塞队列中的任务移至准备队列中,以等待恢复执行被阻塞的任务。
在一示例性实施例中,任务调度装置还包括:
分配模块,被配置为执行:根据协程代码数据中多个任务的初始执行顺序,将多个任务中初始执行的任务分配至执行队列中,将多个任务中的其它任务分配至准备队列中。
在一示例性实施例中,调度控制模块还包括:
监控单元,被配置为执行:对位于执行队列中的任务进行执行状态监控。
转移单元,被配置为执行:如果监控到执行队列中的任务执行完成,则通过调度器将执行完成的任务从执行队列中移除,并将位于准备队列中的任务移至执行队列,以执行被移至执行队列中的任务。
在一示例性实施例中,任务调度装置还包括:
编译模块,被配置为执行:对协程代码数据进行编译,以满足单线程所在运行环境对所运行代码数据的程序语言要求。
调度控制模块包括:
调度控制单元,被配置为执行:通过调度器根据编译后的协程代码数据调度控制多个任务在运行环境的单线程中的切换执行。
上述装置中各个模块的功能和作用的实现过程具体详见上述任务调度方法中对应步骤的实现过程,在此不再赘述。
可以理解,这些模块可以通过硬件、软件、或二者结合来实现。当以硬件方式实现时,这些模块可以实施为一个或多个硬件模块,例如一个或多个专用集成电路。当以软件方式实现时,这些模块可以实施为在一个或多个处理器上执行的一个或多个计算机程序,例如图2的中央处理器270所执行的存储在存储器250中的程序。
本公开还提供一种任务调度装置,如图10所示,该任务调度装置可以用于图1所示实施环境的服务器200中,该任务调度装置1000包括:
处理器1001;及
存储器1002,存储器1002上存储有计算机可读指令,计算机可读指令被处理器1001执行时实现如上任一任务调度方法实施例中的任务调度方法。其中,处理器1001在执行过程中,通过总线/通讯线1003读取存储器1002中的计算机可读指令。
该实施例中的装置的处理器执行操作的具体方式已经在有关该任务调度方法的实施例中执行了详细描述,此处将不做详细阐述说明。
可选的,一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上任一任务调度方法实施例中的任务调度方法。该计算机可读存储介质例如包括计算机程序的存储器250,该计算机程序可由服务器200的中央处理器270执行以实现上述的任务调度方法。
应当理解的是,本发明并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围执行各种修改和改变。本发明的范围仅由所附的权利要求来限制。
Claims (9)
1.一种任务调度方法,其特征在于,包括:
获取多线程代码数据进行程序语法转换所得到的协程代码数据,所述多线程代码数据用于多线程并行执行多个任务;
将所述多个任务添加至调度器中;
通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行;
其中,所述多线程代码数据包括用于多线程并行执行多个任务的任务函数,所述获取所述多线程代码数据进行程序语法转换所得到的协程代码数据之前,还包括:
对所述多线程代码数据进行静态分析,通过所述静态分析确定所述多线程代码数据中每一任务函数所对应的类型;
根据所述每一任务函数所对应的类型,在所述任务函数中添加对应的协程关键字,得到所述协程代码数据;其中,在所协程代码数据运行于所述单线程的过程中,所述调度器通过所述协程关键字进行所述任务函数所对应任务在所述单线程中不同任务队列之间的切换,实现所述多个任务的切换执行。
2.根据权利要求1所述的方法,其特征在于,所述任务队列包括存放当前所执行任务的执行队列、存放被阻塞任务的阻塞队列和存放待执行任务的准备队列,所述通过所述调度器根据所述协程代码数据调度控制所述多个任务在所述单线程中的切换执行,包括:
在所述协程代码数据运行于所述单线程的过程中,根据所述协程关键字判断位于所述执行队列中的任务是否被阻塞;
如果所述位于执行队列中的任务被阻塞,暂停执行位于所述执行队列中被阻塞的任务,通过所述调度器将所述被阻塞的任务移至阻塞队列,并将位于所述准备队列中的任务移至所述执行队列,以执行被移至所述执行队列中的任务。
3.根据权利要求2所述的方法,其特征在于,所述在所述协程代码数据运行于所述单线程的过程中,根据所述协程关键字判断位于所述执行队列中的任务是否被阻塞之后,还包括:
对位于所述阻塞队列中的任务进行监控;
如果监控到造成所述位于所述阻塞队列中任务阻塞的阻塞条件消除,则通过所述调度器将位于所述阻塞队列中的任务移至所述准备队列中,以等待恢复执行所述被阻塞的任务。
4.根据权利要求2所述的方法,其特征在于,所述在所述协程代码数据运行于所述单线程的过程中,根据所述协程关键字判断位于所述执行队列中的任务是否被阻塞之前,还包括:
根据所述协程代码数据中所述多个任务的初始执行顺序,将所述多个任务中初始执行的任务分配至所述执行队列中,将所述多个任务中的其它任务分配至所述准备队列中。
5.根据权利要求1所述的方法,其特征在于,所述通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行,还包括:
对位于所述执行队列中的任务进行执行状态监控;
如果监控到所述执行队列中的任务执行完成,则通过所述调度器将执行完成的任务从所述执行队列中移除,并将位于准备队列中的任务移至所述执行队列,以执行被移至所述执行队列中的任务。
6.根据权利要求1所述的方法,其特征在于,所述通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行之前,还包括:
对所述协程代码数据进行编译,以满足所述单线程所在运行环境对所运行代码数据的程序语言要求;
所述通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行,包括:
通过所述调度器根据编译后的所述协程代码数据调度控制所述多个任务在所述运行环境的单线程中的切换执行。
7.一种任务调度装置,其特征在于,包括:
获取模块,被配置为执行:获取多线程代码数据进行程序语法转换所得到的协程代码数据,所述多线程代码数据用于多线程并行执行多个任务;
添加模块,被配置为执行:将所述多个任务添加至调度器中;
调度控制模块,被配置为执行:通过所述调度器根据所述协程代码数据调度控制所述多个任务在单线程中的切换执行;
其中,所述多线程代码数据包括用于多线程并行执行多个任务的任务函数,所述任务调度装置还包括:
静态分析模块,被配置为执行:对所述多线程代码数据进行静态分析,通过所述静态分析确定所述多线程代码数据中每一任务函数所对应的类型;
协程关键字添加模块,被配置为执行:根据所述每一任务函数所对应的类型,在所述任务函数中添加对应的协程关键字,得到所述协程代码数据;其中,在所协程代码数据运行于所述单线程的过程中,所述调度器通过所述协程关键字进行所述任务函数所对应任务在所述单线程中不同任务队列之间的切换,实现所述多个任务的切换执行。
8.一种任务调度装置,其特征在于,包括:
处理器;及
存储器,所述存储器上存储有计算机可读指令,所述计算机可读指令被所述处理器执行时实现如权利要求1至6中任一项所述的方法。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至6中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811130901.7A CN110955503B (zh) | 2018-09-27 | 2018-09-27 | 任务调度方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811130901.7A CN110955503B (zh) | 2018-09-27 | 2018-09-27 | 任务调度方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110955503A CN110955503A (zh) | 2020-04-03 |
CN110955503B true CN110955503B (zh) | 2023-06-27 |
Family
ID=69967908
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811130901.7A Active CN110955503B (zh) | 2018-09-27 | 2018-09-27 | 任务调度方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110955503B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112612615B (zh) * | 2020-12-28 | 2022-12-06 | 中孚安全技术有限公司 | 基于多线程内存分配和上下文调度的数据处理方法及系统 |
CN112799819A (zh) * | 2021-02-04 | 2021-05-14 | 深圳市大富网络技术有限公司 | 一种程序运行的控制方法、装置及计算机存储介质 |
CN112860401B (zh) * | 2021-02-10 | 2023-07-25 | 北京百度网讯科技有限公司 | 任务调度方法、装置、电子设备和存储介质 |
CN112988355B (zh) * | 2021-03-31 | 2023-12-15 | 深圳市优必选科技股份有限公司 | 程序任务的调度方法、装置、终端设备及可读存储介质 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2005022384A1 (en) * | 2003-08-28 | 2005-03-10 | Mips Technologies, Inc. | Apparatus, method, and instruction for initiation of concurrent instruction streams in a multithreading microprocessor |
WO2005022381A2 (en) * | 2003-08-28 | 2005-03-10 | Mips Technologies, Inc. | Integrated mechanism for suspension and deallocation of computational threads of execution in a processor |
CN1842769A (zh) * | 2003-08-28 | 2006-10-04 | 美普思科技有限公司 | 用于在多线程微处理器中对并行指令流进行初始化的指令 |
US7206843B1 (en) * | 2000-04-21 | 2007-04-17 | Sun Microsystems, Inc. | Thread-safe portable management interface |
CN104142858A (zh) * | 2013-11-29 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 阻塞任务调度方法及装置 |
CN104199730A (zh) * | 2014-08-29 | 2014-12-10 | 浪潮集团有限公司 | 一种基于同步i/o复用机制的单线程多任务处理方法 |
-
2018
- 2018-09-27 CN CN201811130901.7A patent/CN110955503B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7206843B1 (en) * | 2000-04-21 | 2007-04-17 | Sun Microsystems, Inc. | Thread-safe portable management interface |
WO2005022384A1 (en) * | 2003-08-28 | 2005-03-10 | Mips Technologies, Inc. | Apparatus, method, and instruction for initiation of concurrent instruction streams in a multithreading microprocessor |
WO2005022381A2 (en) * | 2003-08-28 | 2005-03-10 | Mips Technologies, Inc. | Integrated mechanism for suspension and deallocation of computational threads of execution in a processor |
CN1842769A (zh) * | 2003-08-28 | 2006-10-04 | 美普思科技有限公司 | 用于在多线程微处理器中对并行指令流进行初始化的指令 |
CN104142858A (zh) * | 2013-11-29 | 2014-11-12 | 腾讯科技(深圳)有限公司 | 阻塞任务调度方法及装置 |
CN104199730A (zh) * | 2014-08-29 | 2014-12-10 | 浪潮集团有限公司 | 一种基于同步i/o复用机制的单线程多任务处理方法 |
Non-Patent Citations (2)
Title |
---|
余志勇,刘光斌,许化龙.分布式测控系统的多线程应用程序设计.计算机工程与应用.1999,(第05期),全文. * |
杨胜哲 ; 于俊清 ; 唐九飞 ; .数据流程序动态调度与优化.计算机工程与科学.2017,(第07期),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN110955503A (zh) | 2020-04-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110955503B (zh) | 任务调度方法及装置 | |
US9772879B2 (en) | System and method for isolating I/O execution via compiler and OS support | |
US20090077564A1 (en) | Fast context switching using virtual cpus | |
WO2022227410A1 (zh) | 一种嵌入式终端远程软件调试方法 | |
US20110219373A1 (en) | Virtual machine management apparatus and virtualization method for virtualization-supporting terminal platform | |
US12242415B2 (en) | Multi-core processor, multi-core processor processing method, and related device | |
US11182318B2 (en) | Processor and interrupt controller | |
US11748108B2 (en) | Instruction executing method and apparatus, electronic device, and computer-readable storage medium | |
US8769233B2 (en) | Adjusting the amount of memory allocated to a call stack | |
EP4035016B1 (en) | Processor and interrupt controller therein | |
CN107526622B (zh) | Linux的快速异常处理方法及装置 | |
US12254355B2 (en) | Method, electronic device, and computer program product for task scheduling | |
US20110161982A1 (en) | Task Controlling A Multitask System | |
JP2021157843A (ja) | 命令を実行するための方法、装置、機器及びコンピュータ読み取り可能な記憶媒体 | |
CN111338777B (zh) | 一种低延时高稳定性的自主平台中断响应方法及设备 | |
CN112470125B (zh) | 中断处理方法、计算机系统以及存储介质 | |
US6675238B1 (en) | Each of a plurality of descriptors having a completion indicator and being stored in a cache memory of an input/output processor | |
CN109426556B (zh) | 一种进程调度方法和装置 | |
CN115794390A (zh) | 一种任务控制装置、电子设备及存储介质 | |
US9015720B2 (en) | Efficient state transition among multiple programs on multi-threaded processors by executing cache priming program | |
CN114185667A (zh) | 数据处理方法及装置以及相关产品 | |
Moisuc et al. | Hardware event handling in the hardware real-time operating systems | |
CN110955507B (zh) | 基于vxWorks系统的多任务访问同一IIC总线的方法 | |
JPH07244594A (ja) | データ処理装置 | |
CN117093266A (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 |