CN107329812B - 一种运行协程的方法和装置 - Google Patents
一种运行协程的方法和装置 Download PDFInfo
- Publication number
- CN107329812B CN107329812B CN201710432602.8A CN201710432602A CN107329812B CN 107329812 B CN107329812 B CN 107329812B CN 201710432602 A CN201710432602 A CN 201710432602A CN 107329812 B CN107329812 B CN 107329812B
- Authority
- CN
- China
- Prior art keywords
- journey
- target
- association
- target association
- function
- 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
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/485—Task life-cycle, e.g. stopping, restarting, resuming execution
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Navigation (AREA)
Abstract
本发明公开了一种运行协程,属于计算机技术领域。所述方法包括:在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程。采用本发明,可以保证在进程rusume后,协程正常运行。
Description
技术领域
本发明涉及计算机技术领域,特别涉及一种运行协程的方法和装置。
背景技术
随着计算机技术的不断发展,服务端所提供的业务越来越复杂、多样化,这些业务往往涉及大量的异步处理,而一般情况下会采用协程(用来实现某些独立功能的函数)来进行这些异步处理。例如,游戏服务端提供的用户登录这一业务,涉及在线状态检测,账户安全检测,账户数据获取等多种异步处理,在实现用户登录的进程中,可以使用不同的协程分别进行上述异步处理。
业务的某一线程在进行至某一步时,如果需要获取某个参数A,则可以创建相关协程,由该协程进行上述A的获取处理。协程在获取A的过程中,发现需要获取参数B,则可以暂停处理(可称为挂起),存储协程的上下文(上下文包括协程的函数返回地址和运行数据),并记录对应的存储地址,同时向外部(可以是其它协程或线程)发送B的获取请求。进而,当接收到外部返回的B后,协程可以再次运行(可称为激活),即根据记录的存储地址,读取协程上下文,然后基于B进行后续处理。
在实现本发明的过程中,发明人发现现有技术至少存在以下问题:
现有服务端一般采用resume(重新启动)机制来提高进程容灾能力,主要是将整个业务的进程(进程中可以包括多个线程)的运行数据保存在共享存储区域中,这样,在进程意外崩溃再次重启后,存储在共享存储区域中的运行数据也不会损坏或丢失。同时,在resume机制下,在进程重新启动后,为了防止共享存储区域中的运行数据被恶意窃取,一般都会对共享存储区域内数据的存储地址进行随机偏移,这样,协程挂起时存储的上下文的实际存储地址将会发生变化,协程中记录的存储地址将会失效,协程将无法正常运行。
发明内容
为了解决现有技术的问题,本发明实施例提供了一种运行协程的方法和装置。所述技术方案如下:
第一方面,提供了一种运行协程的方法,所述方法包括:
在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;
当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;
重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程。
第二方面,提供了一种运行协程的装置,所述装置包括:
存储模块,用于在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;
获取模块,用于当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;
运行模块,用于重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程。
第三方面,提供了一种网络设备,所述网络设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如第一方面所述的运行协程的方法。
第四方面,提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如第一方面所述的运行协程的方法。
本发明实施例提供的技术方案带来的有益效果是:
本发明实施例中,当进程resume时,其存储在共享存储区域内的进程数据的存储地址整体发生偏移,进程数据中包括目标协程挂起时存储的函数执行位置和运行数据。采用本方案,因为记录了上述目标协程的相关数据在进程数据的存储区域内的相对位置,故而,即使进程数据的存储地址发生了偏移,由于相对位置没有发生变化,在目标协程挂起时,如果进程resume了,也可以基于相对位置查找到记录的目标协程的相关数据,从而可以继续运行目标协程。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种运行协程的方法流程图;
图2是本发明实施例提供的一种运行协程的场景示意图;
图3是本发明实施例提供的一种运行协程的原理示意图;
图4是本发明实施例提供的一种运行协程时故障检测的示意图;
图5是本发明实施例提供的一种运行协程的总体框架示意图;
图6是本发明实施例提供的一种运行协程的装置结构示意图;
图7是本发明实施例提供的一种运行协程的装置结构示意图;
图8是本发明实施例提供的一种运行协程的装置结构示意图;
图9是本发明实施例提供的一种运行协程的装置结构示意图;
图10是本发明实施例提供的一种网络设备的结构示意图;
图11是本发明实施例提供的一种代码的示意图;
图12是本发明实施例提供的一种协程控制块的内容组成的示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。
本发明实施例提供了一种运行协程的方法,本方法主要运用在网络设备上,网络设备可以是网络业务提供方的服务器,也可以是终端,本实施例中,以服务器为主进行说明,终端的实现过程与之相似。服务器可以是具有实现网络业务功能的任意服务器,可以是网络游戏的后台服务器,或者是社交软件的后台服务器等。服务器上可以运行有网络业务对应的业务进程,每个业务进程可以包括有多个处理线程,用于处理业务的不同功能请求。服务器中可以包括处理器、存储器、收发器,处理器可以用于进行下述流程中的运行协程的处理,存储器可以用于存储下述处理过程中需要的数据以及产生的数据,收发器可以用于接收和发送下述处理过程中的相关数据,如用于向外部设备发送某个参数的获取请求,接收外部设备返回的参数等。本实施例中,以服务器为网络游戏的后台服务器为例进行说明,其它情况与之类似,本实施不再进行一一说明。
下面将结合具体实施方式,对图1所示的处理流程进行详细的说明,内容可以如下,具体场景可以参考图2,此处,以用户登录游戏服务器,创建游戏角色的过程为例进行说明,服务器可以接收终端发送的角色创建请求,然后创建相应的线程,该线程中需要完成角色名查重、角色模型数据记录、新手邮件发送等等处理,而这些处理,可以分别通过多个协程来执行完成:
下面将结合具体实施方式,对图1所示的处理流程进行详细的说明,内容可以如下:
步骤101,在目标协程运行的过程中,当目标协程挂起时,存储目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置。
其中,目标存储位置为函数执行位置和运行数据的存储位置,初始存储位置为目标协程所属进程的存储区域的初始位置。
在实施中,用户通过终端登录服务器,并进行角色创建后,服务器可以接收到相应的角色创建请求,然后获取该角色创建请求中携带的角色数据,角色数据可以包括角色名、角色模型数据、角色所属区域等等,然后服务器可以调用相关的角色创建处理函数(即线程代码),创建角色处理线程,用于进行上述用户发起的角色创建处理。创建角色处理线程之后,服务器可以按照角色创建处理函数的执行逻辑来运行该角色处理线程,该角色处理线程需要完成角色名查重、角色模型数据记录、新手邮件发送等大量角色创建过程中涉及的处理,这样,可以分别通过多个协程来实现相关功能。具体的,在角色创建处理函数中,可以预先写好调用相关协程函数(如用于角色名查重的函数)的代码,当角色创建处理线程执行至该代码对应的步骤时,可以触发调用相关协程函数的处理,即创建目标协程,进而服务器可以运行该目标协程,通过目标协程来实现角色名查重的处理。
而在目标协程运行的过程中,可以会涉及其它协程函数的调用处理或者向其它线程/设备发送某个参数的获取请求,可以理解,与上文原理相同,在协程函数的指定步骤处可以写有调用其它协程函数或者发送参数获取请求的代码。这样,在目标协程运行的过程中,当运行至上述代码时,如果触发了调用其它协程函数的处理,目标协程挂起(即处于挂起状态),服务器则可以将目标协程的处理资源提供给该被调用的协程函数,以使被调用的协程函数利用上述处理资源实现相关功能,或者,如果触发了向其它线程/设备发送某个参数的获取请求,服务器则可以将目标协程的处理资源用于其它处理。
当目标协程挂起时,服务器可以记录目标协程当前的函数执行位置,以及目标执行过程中的临时变量。具体的,可以在目标协程当前的函数执行位置处添加标记,然后通过记录该标记对应的数值来达到记录当前的函数执行位置的目的。结合传统协程的执行逻辑来看,当传统协程执行到“yield”语句时,传统协程让出处理资源进入挂起状态,本方案中的协程则可以利用宏定义在“yield”处***一个“case”分支语句(即标记),然后保存case的label值。之后,可以再记录上述函数执行位置和运行数据的存储位置(即目标存储位置)和目标协程所属进程的存储区域的初始位置的相对位置。此处,具体可以通过存储单元的字节位置进行记录,例如:相对位置可以是初始位置后的第200字节至第300字节等。
值得一提的是,上述说明过程中,目标协程可以是主线程所调用的协程(可以理解为一级调用协程),在其它实施例中,目标协程还可以是由其它协程调用的协程(可以理解为多级调用协程),其原理相似,故本实施例中不对所有情况分别进行一一说明。
可选的,服务器可以为每个协程分配独立的,用于存储协程挂起时的函数执行位置和运行数据的存储单元,故而,当创建目标协程时,为目标协程分配目标存储单元,相应的,步骤101的处理可以如下:将目标协程当前的函数执行位置和运行数据存储至目标存储单元,记录目标存储单元的存储位置与初始存储位置的相对位置。
在实施中,目标协程所属的进程中可以包含有协程管理线程,用于管理整个进程中所有协程的相关数据(包括协程挂起时的函数执行位置和运行数据)。所有协程的数据可以统一存储在某一存储区域(可以称之为协程池),该协程池中包括若干个存储单元(可以称之为协程控制块),并且可以有一个游标指向当前正在运行的协程对应的协程控制块。具体到本实施例中,在创建目标协程时,服务器可以通过协程管理线程为目标协程分配一个协程控制块,同时在该协程控制块中存储目标协程的标识。这样,在目标协程运行时,协程池的游标始终指向目标协程对应的协程控制块,当触发目标协程挂起时,服务器可以将目标协程当前的函数执行位置和运行数据存储至协程控制块中,然后再记录目标存储单元的存储位置与初始存储位置的相对位置。
步骤102,当检测到目标协程的激活触发事件时,根据相对位置,获取函数执行位置和运行数据。
在实施中,目标协程运行后,如果运行至预设的协程挂起处,如执行到“yield”语句时,触发目标协程进入挂起状态,服务器此时则可以将目标协程的处理资源重新分配。在目标协程挂起后,如果检测到目标协程的激活触发事件,则可以进行目标协程的激活处理,具体可以先获取步骤101中目标协程挂起时,记录的目标存储位置和初始存储位置的相对位置,然后在目标协程所属进程的存储区域内确定该相对位置对应的存储空间,进而可以在该存储空间中获取目标协程挂起时存储的函数执行位置和运行数据。例如,相对位置可以是初始位置后的第200字节至第300字节,则在检测到目标协程的激活触发时间后,先获取到“200字节-300字节”的相对位置,然后确定目标协程所属进程的存储空间的初始存储位置,如在整个共享存储区域的第10000字节处,故而,可以确定出步骤101中的目标存储位置为共享存储区域内的第10200字节至第10300字节,这样,则可以在该存储区域内获取到目标协程挂起时所存储的函数执行位置和运行数据。
值得一提的是,目标协程的激活触发事件可以多种多样,不同的协程可以设定有不同的激活触发事件,激活触发事件可以是接收到外界返回的消息,或者可以是到达某个时间点,还可以是挂起后经历预设时长等等。此处,“外界”可以是指同样运行在服务器中的目标协程之外的协程、线程、进程,也还可以是运行在其它设备上,与服务器进行数据传输的协程、线程、进程等。本实施例中,后续在必要处,将以激活触发事件为接收到其它协程返回的消息为例进行说明。
可选的,基于上述目标存储单元(协程控制块)的概念,步骤102的处理可以为:当检测到目标协程的激活触发事件时,获取目标存储单元中存储的函数执行位置和运行数据。
在实施中,在目标协程挂起后,当检测到目标协程的激活触发事件时,触发激活目标协程,服务器则可以根据上述相对位置以及目标协程的标识找到目标存储单元,然后获取目标存储单元中存储的函数执行位置和运行数据。
步骤103,重新调用目标协程的函数,基于函数执行位置和运行数据,继续运行目标协程。
在实施中,目标协程在处于挂起状态时,服务器如果检测到目标协程的激活触发事件后,将会进行目标协程的激活处理,从而目标协程的挂起处继续运行目标协程。其具体过程可以如下:在激活目标协程前,可以如步骤102,先基于记录的相对位置,获取到目标协程挂起时存储的函数执行位置和运行数据。然后可以重新调用目标协程的函数,根据存储的函数执行位置确定目标协程挂起时运行到的位置,然后再调取存储的运行数据,从挂起的位置处继续运行目标协程。参考步骤101中“利用宏定义在“yield”处***一个“case”分支语句(即标记),然后保存case的label值”的例子,此处的处理可以是在激活时重新调用目标协程的函数,然后通过“switch”语句以及上述保存的label值直接跳转到相应的case语句处,继续运行目标协程,即用switch语句代替了传统协程中“reenter”,这样,则可以通过“switch-case”分支语句来模拟出传统协程的挂起和激活语义。具体可以如以下图11代码所示,其中,利用“switch(pos)”代替了“reenter”的功能,利用“pos=n;return;case n”代替了“yield”的功能。
可选的,在重新调用协程的函数前,需要判断协程是否处于挂起状态,相应的,步骤103的部分处理可以如下:如果目标协程的执行状态为挂起状态,则重新调用目标协程的函数。
在实施中,本实施例中采用“switch-case”语句实现了传统协程“reenter-yield”(激活-挂起)语句的功能,其中,如图3所示,在“yield”处采用了“pos-return-case”的组合语句替换“yield”语句,这样,可以理解,在目标协程挂起后被激活时,“return”语句将会触发返回目标协程的上级函数的处理,而该上级函数继续执行,触发重新调用目标协程的函数的处理。而不得不提的是,在目标协程的函数最后,同样存在“return”语句,用于在目标协程运行完毕后,触发返回目标协程的上级函数的处理。这样,在重新调用目标协程的函数之前,可以检测目标协程的执行状态,如果目标协程的执行状态为挂起状态,则可以重新调用目标协程的函数,而如果目标协程的执行状态为执行完毕状态,则不再调用目标协程的函数。结合上述协程控制块的处理,可以添加状态标记项,在每次激活目标协程时将协程控制块中的状态标记项设置为A,当目标协程执行到yield时将状态标记项设置为B。进而在重新调用目标协程的函数时,可以先查看目标协程对应的协程控制块中的状态标记,如果状态标记为A,则表示目标协程运行完毕,从而可以直接删除该协程控制块,而如果状态标记为B,则目标协程为挂起状态,从而可以激活目标协程,即重新调用目标协程的函数。协程控制块的内容组成可以参考图12所示,其中,“pos”字段用于存储目标协程的函数执行位置,“userdata”字段用于存储目标协程的运行数据,“id”字段用于记录目标协程的标识,“exitflag”字段用于存储目标协程的状态标记。
此处,将结合图3,对上述运行协程的步骤进行具体说明,在创建目标协程时,在协程池中为目标协程分配协程控制块,在协程控制块中写入目标协程的标识,将协程控制块提供给目标协程进行数据存储(即图中传入协程的处理),在目标协程运行至“yield”语句时,在协程控制块中记录函数执行位置、临时数据和状态标记等,当目标协程激活时,重新调用目标协程的函数,将协程控制块中的数据传入目标协程,继续运行目标协程。
可选的,为了防止协程导致进程重复宕机,可以设置协程故障隔离机制,相应的处理可以如下:在目标协程运行的过程中,如果目标协程所属的进程出现故障,则将目标协程对应的故障次数加一;如果目标协程对应的故障次数大于第一预设阈值,则在目标协程所属的进程重新启动时,终止运行目标协程和目标协程的父协程,并将目标协程所属的协程类型对应的故障次数加一。
其中,目标协程的父协程为触发调用目标协程的函数的协程。
在实施中,目标协程在运行过程中,如果目标协程所属的进程出现故障,发生宕机,服务器则需要对该进程进行resume,即从共享存储区域中调取该进程宕机前存储的所有数据,并根据这些数据重新启动进程。在进程resume后,将会继续运行目标协程。如果目标协程所属的进程频繁宕机,则可以认为目标协程导致了上述故障,故而可以在发生一定次数的故障后,在重新启动进程时,终止运行目标协程。具体可以先设定一个故障次数阈值(即第一预设阈值),然后在目标协程运行的过程中,每次目标协程所属的进程出现了故障,则将目标协程对应的故障次数加一,这样,在每次进程resume后再次运行目标协程时,可以先检测目标协程对应的故障次数,如果其大于第一预设阈值,则可以认为故障是由目标协程引发的,故而可以不再重新运行目标协程,即返回目标协程的上一级函数,略过目标协程的调用步骤,继续执行后续处理。进一步的,为了避免到目标协程的父协程在执行时反复调用目标协程,故而在终止运行目标协程时,还可以终止运行目标协程的父协程。需要说明的是,父协程可以是指目标协程的所有上级协程,如线程A调用协程B,协程B调用协程C,协程C调用目标协程D,则目标协程D的父协程可以包括协程B和协程C。另外,在终止运行目标协程及其父协程后,服务器可以对故障进行记录,并提示技术人员目标协程出现问题。一般情况下,服务器侧的技术人员可以预先针对某个线程中各个协程的调用步骤设置故障处理方案,当调用的协程运行时出现故障,或者协程无法调用时,即触发预设的故障处理方案,该故障处理方案可以是跳过调用步骤,或者是调用备用函数等等,这样,在终止目标协程及其父协程后,目标协程所属的线程也不会停止运行,可以继续进行其它处理。
进一步的,在终止运行目标协程和目标协程的父协程之后,可以记录目标协程因出现故障而被终止的次数,同时,为了避免和目标协程属于同一协程类型的其它协程存在相同的故障,可以将相同协程类型的协程因故障被终止的次数统一记录,故而在目标协程被终止运行后,服务器可以将目标协程所属的协程类型对应的故障次数加一。
可选的,基于上述故障隔离机制,可以在目标协程创建时即对其进行检测,相应的处理可以如下:当再次创建目标协程时,如果目标协程所属的协程类型对应的故障次数大于第二预设阈值,则拒绝创建目标协程。
在实施中,当再次创建目标协程时,服务器可以先检测目标协程所属的协程类型对应的故障次数,如果该故障次数大于第二预设阈值,则可以判定该协程类型下的协程有很大几率导致进程出现故障,则可以拒绝创建目标协程,即显示创建失败消息。当然,技术人员在对目标协程所属的协程类型下所有协程进行修复后,可以将对应的故障次数清零,这样,当再次创建目标协程时,服务器则可以顺利调用目标协程的函数,并运行目标协程。
此处将结合图4,对上述故障隔离的处理进行具体说明,当目标协程运行时,引发其所属进程出现故障进行resume,如果resume次数大于一定阈值(等同于故障发生次数达到预设阈值),则终止运行目标协程及其父协程,并确定目标协程的类别,然后将目标协程所属的协程类型对应的故障次数加一。进而,在创建新的协程时,可以先对该协程所属的协程类别进行判断,如果协程类别对应的故障次数大于预设阈值,则拒绝创建该协程,如果协程类型对应的故障次数小于预设阈值,则正常创建协程,上述处理即为图中的“协程类型过滤”。
图5为本实施例的总体框架图,其中主要包括协程管理层、协程、故障隔离三个部分,协程管理层部分又可理解为协程管理线程,用于管理协程池中各协程对应的协程控制块,协程部分示出了协程运行时,在“yield”语句处触发挂起,待外界返回消息后激活协程的运行机制,故障隔离部分即实现了上述根据故障次数,终止运行协程或者拒绝创建协程的处理。
本发明实施例中,当进程resume时,其存储在共享存储区域内的进程数据的存储地址整体发生偏移,进程数据中包括目标协程挂起时存储的函数执行位置和运行数据。采用本方案,因为记录了上述目标协程的相关数据在进程数据的存储区域内的相对位置,故而,即使进程数据的存储地址发生了偏移,由于相对位置没有发生变化,在目标协程挂起时,如果进程resume了,也可以基于相对位置查找到记录的目标协程的相关数据,从而可以继续运行目标协程。
为了便于理解方案,本发明实施例还示例性地提供了一种网络设备中运行协程的整体处理流程,具体可以如下:
步骤一:游戏A的服务器(即网络设备)接收游戏A的客户端发送的角色B的创建请求;
步骤二:服务器在游戏A的进程下创建角色B的创建并运行线程C;
步骤三:服务器运行线程C时,需要进行角色名查重处理,调用角色名查重函数,触发创建协程D;
步骤四:服务器检测协程D所属的协程类型对应的故障次数,如果故障次数大于预设阈值,则停止创建协程D,如果故障次数小于预设阈值,则跳转至步骤五;
步骤五:服务器创建并运行协程D,并为协程D分配协程控制块E;
步骤六:服务器运行协程D时,协程D需要获取数据F,协程D挂起,服务器向数据库发送数据F的获取请求;
步骤七:服务器在协程控制块E中存储协程D的函数执行位置和运行数据,并释放协程D占用的处理资源;
步骤八:服务器接收数据库返回的数据F;
步骤九:服务器查找协程控制块E,获取其中存储的协程D的函数执行位置和运行数据;
步骤十:服务器根据上述函数执行位置和运行数据继续运行协程D;
步骤十一:协程D运行完毕,返回角色名查重结果;
步骤十二:服务器基于角色名查重结果继续运行线程C。
基于相同的技术构思,本发明实施例还提供了一种运行协程的装置,如图6所示,该装置包括:
存储模块601,用于在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;
获取模块602,用于当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;
运行模块603,用于重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程。
可选的,如图7所示,所述装置还包括:
分配模块604,用于当创建所述目标协程时,为所述目标协程分配目标存储单元;
所述存储模块601,具体用于:
将所述目标协程当前的函数执行位置和运行数据存储至所述目标存储单元,记录所述目标存储单元的存储位置与初始存储位置的相对位置。
可选的,所述运行模块603,具体用于:
如果所述目标协程的执行状态为挂起状态,则重新调用所述目标协程的函数。
可选的,如图8所示,所述装置还包括:
故障记录模块605,用于在所述目标协程运行的过程中,如果所述目标协程所属的进程出现故障,则将所述目标协程对应的故障次数加一;
终止模块606,用于如果所述目标协程对应的故障次数大于第一预设阈值,则在所述目标协程所属的进程重新启动时,终止运行所述目标协程和所述目标协程的父协程,并将所述目标协程所属的协程类型对应的故障次数加一,其中,所述目标协程的父协程为触发调用所述目标协程的函数的协程。
可选的,如图9所示,所述装置还包括:
创建模块607,用于当再次创建所述目标协程时,如果所述目标协程所属的协程类型对应的故障次数大于第二预设阈值,则拒绝创建所述目标协程。
本发明实施例中,当进程resume时,其存储在共享存储区域内的进程数据的存储地址整体发生偏移,进程数据中包括目标协程挂起时存储的函数执行位置和运行数据。采用本方案,因为记录了上述目标协程的相关数据在进程数据的存储区域内的相对位置,故而,即使进程数据的存储地址发生了偏移,由于相对位置没有发生变化,在目标协程挂起时,如果进程resume了,也可以基于相对位置查找到记录的目标协程的相关数据,从而可以继续运行目标协程。
需要说明的是:上述实施例提供的运行协程的装置在运行协程时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的运行协程的装置与运行协程的方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
图10是根据一示例性实施例示出的一种网络设备的结构示意图。该网络设备可以用于实施上述实施例中提供的运行协程的方法。
网络设备1000可以包括有一个或一个以上计算机可读存储介质的存储器120、输入单元130、显示单元140、传感器150、音频电路160、WiFi(wireless fidelity,无线保真)模块170、包括有一个或者一个以上处理核心的处理器180、以及电源190等部件。本领域技术人员可以理解,图10中示出的网络设备结构并不构成对网络设备的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。其中:
存储器120可用于存储软件程序以及模块,处理器180通过运行存储在存储器120的软件程序以及模块,从而执行各种功能应用以及数据处理。存储器120可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作***、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据网络设备1000的使用所创建的数据(比如音频数据、电话本等)等。此外,存储器120可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。相应地,存储器120还可以包括存储器控制器,以提供处理器180和输入单元130对存储器120的访问。
输入单元130可用于接收输入的数字或字符信息,以及产生与用户设置以及功能控制有关的键盘、鼠标、操作杆、光学或者轨迹球信号输入。具体地,输入单元130可包括触敏表面131以及其他输入设备132。触敏表面131,也称为触摸显示屏或者触控板,可收集用户在其上或附近的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在触敏表面131上或在触敏表面131附近的操作),并根据预先设定的程式驱动相应的连接装置。可选的,触敏表面131可包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给处理器180,并能接收处理器180发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现触敏表面131。除了触敏表面131,输入单元130还可以包括其他输入设备132。具体地,其他输入设备132可以包括但不限于物理键盘、功能键(比如音量控制按键、开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
显示单元140可用于显示由用户输入的信息或提供给用户的信息以及网络设备1000的各种图形用户接口,这些图形用户接口可以由图形、文本、图标、视频和其任意组合来构成。显示单元140可包括显示面板141,可选的,可以采用LCD(Liquid CrystalDisplay,液晶显示器)、OLED(Organic Light-Emitting Diode,有机发光二极管)等形式来配置显示面板141。进一步的,触敏表面131可覆盖显示面板141,当触敏表面131检测到在其上或附近的触摸操作后,传送给处理器180以确定触摸事件的类型,随后处理器180根据触摸事件的类型在显示面板141上提供相应的视觉输出。虽然在图10中,触敏表面131与显示面板141是作为两个独立的部件来实现输入和输入功能,但是在某些实施例中,可以将触敏表面131与显示面板141集成而实现输入和输出功能。
网络设备1000还可包括至少一种传感器150,比如光传感器、运动传感器以及其他传感器。具体地,光传感器可包括环境光传感器及接近传感器,其中,环境光传感器可根据环境光线的明暗来调节显示面板141的亮度,接近传感器可在网络设备1000移动到耳边时,关闭显示面板141和/或背光。作为运动传感器的一种,重力加速度传感器可检测各个方向上(一般为三轴)加速度的大小,静止时可检测出重力的大小及方向,可用于识别手机姿态的应用(比如横竖屏切换、相关游戏、磁力计姿态校准)、振动识别相关功能(比如计步器、敲击)等;至于网络设备1000还可配置的陀螺仪、气压计、湿度计、温度计、红外线传感器等其他传感器,在此不再赘述。
音频电路160、扬声器161,传声器162可提供用户与网络设备1000之间的音频接口。音频电路160可将接收到的音频数据转换后的电信号,传输到扬声器161,由扬声器161转换为声音信号输出;另一方面,传声器162将收集的声音信号转换为电信号,由音频电路160接收后转换为音频数据,再将音频数据输出处理器180处理后,经RF电路110以发送给比如另一网络设备,或者将音频数据输出至存储器120以便进一步处理。音频电路160还可能包括耳塞插孔,以提供外设耳机与网络设备1000的通信。
WiFi属于短距离无线传输技术,网络设备1000通过WiFi模块170可以帮助用户收发电子邮件、浏览网页和访问流式媒体等,它为用户提供了无线的宽带互联网访问。虽然图10示出了WiFi模块170,但是可以理解的是,其并不属于网络设备1000的必须构成,完全可以根据需要在不改变发明的本质的范围内而省略。
处理器180是网络设备1000的控制中心,利用各种接口和线路连接整个手机的各个部分,通过运行或执行存储在存储器120内的软件程序和/或模块,以及调用存储在存储器120内的数据,执行网络设备1000的各种功能和处理数据,从而对手机进行整体监控。可选的,处理器180可包括一个或多个处理核心;优选的,处理器180可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作***、用户界面和应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到处理器180中。
网络设备1000还包括给各个部件供电的电源190(比如电池),优选的,电源可以通过电源管理***与处理器180逻辑相连,从而通过电源管理***实现管理充电、放电、以及功耗管理等功能。电源190还可以包括一个或一个以上的直流或交流电源、再充电***、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。
具体在本实施例中,网络设备1000的显示单元是触摸屏显示器,网络设备1000还包括有存储器,以及一个或者一个以上的程序,其中一个或者一个以上程序存储于存储器中,且经配置以由一个或者一个以上处理器执行述一个或者一个以上程序包含用于进行上述运行协程的处理的指令。
本领域普通技术人员可以理解实现上述实施例的全部或部分步骤可以通过硬件来完成,也可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (10)
1.一种运行协程的方法,其特征在于,所述方法包括:
在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;
当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;
重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程;
在所述目标协程运行的过程中,如果所述目标协程所属的进程出现故障,则将所述目标协程对应的故障次数加一;
如果所述目标协程对应的故障次数大于第一预设阈值,则在所述目标协程所属的进程重新启动时,终止运行所述目标协程和所述目标协程的父协程,并将所述目标协程所属的协程类型对应的故障次数加一,其中,所述目标协程的父协程为触发调用所述目标协程的函数的协程。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当创建所述目标协程时,为所述目标协程分配目标存储单元;
所述存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,包括:
将所述目标协程当前的函数执行位置和运行数据存储至所述目标存储单元,记录所述目标存储单元的存储位置与初始存储位置的相对位置。
3.根据权利要求1或2所述的方法,其特征在于,所述重新调用所述目标协程的函数,包括:
如果所述目标协程的执行状态为挂起状态,则重新调用所述目标协程的函数。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
当再次创建所述目标协程时,如果所述目标协程所属的协程类型对应的故障次数大于第二预设阈值,则拒绝创建所述目标协程。
5.一种运行协程的装置,其特征在于,所述装置包括:
存储模块,用于在目标协程运行的过程中,当所述目标协程挂起时,存储所述目标协程当前的函数执行位置和运行数据,记录目标存储位置和初始存储位置的相对位置,其中,所述目标存储位置为所述函数执行位置和运行数据的存储位置,所述初始存储位置为所述目标协程所属进程的存储区域的初始位置;
获取模块,用于当检测到所述目标协程的激活触发事件时,根据所述相对位置,获取所述函数执行位置和运行数据;
运行模块,用于重新调用所述目标协程的函数,基于所述函数执行位置和运行数据,继续运行所述目标协程;
故障记录模块,用于在所述目标协程运行的过程中,如果所述目标协程所属的进程出现故障,则将所述目标协程对应的故障次数加一;
终止模块,用于如果所述目标协程对应的故障次数大于第一预设阈值,则在所述目标协程所属的进程重新启动时,终止运行所述目标协程和所述目标协程的父协程,并将所述目标协程所属的协程类型对应的故障次数加一,其中,所述目标协程的父协程为触发调用所述目标协程的函数的协程。
6.根据权利要求5所述的装置,其特征在于,所述装置还包括:
分配模块,用于当创建所述目标协程时,为所述目标协程分配目标存储单元;
所述存储模块,具体用于:
将所述目标协程当前的函数执行位置和运行数据存储至所述目标存储单元,记录所述目标存储单元的存储位置与初始存储位置的相对位置。
7.根据权利要求5或6所述的装置,其特征在于,所述运行模块,具体用于:
如果所述目标协程的执行状态为挂起状态,则重新调用所述目标协程的函数。
8.根据权利要求5所述的装置,其特征在于,所述装置还包括:
创建模块,用于当再次创建所述目标协程时,如果所述目标协程所属的协程类型对应的故障次数大于第二预设阈值,则拒绝创建所述目标协程。
9.一种网络设备,其特征在于,所述网络设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如权利要求1至4任一所述的运行协程的方法。
10.一种计算机可读存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由处理器加载并执行以实现如权利要求1至4任一所述的运行协程的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710432602.8A CN107329812B (zh) | 2017-06-09 | 2017-06-09 | 一种运行协程的方法和装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710432602.8A CN107329812B (zh) | 2017-06-09 | 2017-06-09 | 一种运行协程的方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107329812A CN107329812A (zh) | 2017-11-07 |
CN107329812B true CN107329812B (zh) | 2018-07-06 |
Family
ID=60195170
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710432602.8A Active CN107329812B (zh) | 2017-06-09 | 2017-06-09 | 一种运行协程的方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107329812B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618868A (zh) * | 2019-08-29 | 2019-12-27 | 凡普数字技术有限公司 | 对数据进行批量写入的方法、装置以及存储介质 |
CN110955520A (zh) * | 2019-11-05 | 2020-04-03 | 中国电力科学研究院有限公司 | 一种面向电能表的多任务调度方法和*** |
CN112395050B (zh) * | 2020-11-30 | 2024-02-23 | 深信服科技股份有限公司 | 一种虚拟机备份方法、装置、电子设备及可读存储介质 |
CN116155686B (zh) * | 2023-01-30 | 2024-05-31 | 浪潮云信息技术股份公司 | 一种云环境下判定节点故障的方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7421572B1 (en) * | 1999-09-01 | 2008-09-02 | Intel Corporation | Branch instruction for processor with branching dependent on a specified bit in a register |
US8079035B2 (en) * | 2005-12-27 | 2011-12-13 | Intel Corporation | Data structure and management techniques for local user-level thread data |
CN104461730B (zh) * | 2013-09-22 | 2017-11-07 | 华为技术有限公司 | 一种虚拟资源分配方法及装置 |
CN106598801A (zh) * | 2015-10-15 | 2017-04-26 | 中兴通讯股份有限公司 | 一种协程监控方法及装置 |
-
2017
- 2017-06-09 CN CN201710432602.8A patent/CN107329812B/zh active Active
Also Published As
Publication number | Publication date |
---|---|
CN107329812A (zh) | 2017-11-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107329812B (zh) | 一种运行协程的方法和装置 | |
CN104639672B (zh) | 进行域名解析的方法和装置 | |
CN105278937B (zh) | 一种显示弹出框消息的方法及装置 | |
CN104142868B (zh) | 建立连接的方法及装置 | |
CN107357725B (zh) | 应用测试方法及装置 | |
CN104427074B (zh) | 一种显示来电信息的方法、装置和*** | |
CN105022955B (zh) | 一种应用程序的锁定方法及移动终端 | |
CN104980455B (zh) | 一种基于云存储的多终端数据同步方法、装置和*** | |
CN108039963B (zh) | 一种容器配置方法、装置及存储介质 | |
CN106709347B (zh) | 应用运行的方法及装置 | |
CN106708734A (zh) | 软件异常检测方法及装置 | |
US11656928B2 (en) | Detecting datacenter mass outage with near real-time/offline using ml models | |
CN106778117A (zh) | 权限开启方法、装置及*** | |
CN108595218A (zh) | 一种加载***动态库的方法和装置 | |
CN107329901A (zh) | 数据包抓取方法、终端、服务器和存储介质 | |
CN106708554A (zh) | 程序运行方法及装置 | |
CN104077184B (zh) | 一种应用程序的进程控制方法及计算机*** | |
CN108804915A (zh) | 病毒程序清理方法、存储设备及电子终端 | |
CN106713608A (zh) | 应用的功能状态修改方法、装置及终端 | |
CN104239316B (zh) | 查找对象的方法及装置 | |
CN106789307B (zh) | 配置数据处理方法、装置及*** | |
CN108090345A (zh) | linux***外部命令执行方法及装置 | |
CN107015866B (zh) | 一种数据处理方法及装置 | |
CN107066860B (zh) | 一种指纹识别方法及移动终端 | |
CN108809805A (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 |