CN116932248A - 一种基于线程和协程的事件处理方法、装置和终端设备 - Google Patents
一种基于线程和协程的事件处理方法、装置和终端设备 Download PDFInfo
- Publication number
- CN116932248A CN116932248A CN202310908521.6A CN202310908521A CN116932248A CN 116932248 A CN116932248 A CN 116932248A CN 202310908521 A CN202310908521 A CN 202310908521A CN 116932248 A CN116932248 A CN 116932248A
- Authority
- CN
- China
- Prior art keywords
- event
- coroutine
- thread
- target
- wake
- 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.)
- Pending
Links
- 238000003672 processing method Methods 0.000 title claims abstract description 18
- 238000000034 method Methods 0.000 claims abstract description 42
- 230000008569 process Effects 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 8
- 230000006870 function Effects 0.000 description 5
- 230000001360 synchronised effect Effects 0.000 description 5
- 238000004891 communication Methods 0.000 description 2
- 238000010586 diagram Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000903 blocking effect Effects 0.000 description 1
- 230000001413 cellular effect Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
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/54—Interprogram communication
- G06F9/542—Event management; Broadcasting; Multicasting; Notifications
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Multimedia (AREA)
- Telephonic Communication Services (AREA)
Abstract
本发明公开了一种基于线程和协程的事件处理方法、装置和终端设备,所述方法:从线程的线程事件队列中获取目标事件;在确定目标事件的类型为业务事件时,将目标事件发送至目标事件对应的第一协程中进行处理;在确定目标事件的类型为唤醒事件或超时事件时,则解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理。本发明通过主线程和协程相结合的方式,将存在需要执行超过第一预设时长的长调用操作对应的事件挂起后返回线程中再获取下一个事件进行处理,从而执行并完成各个事件的处理操作,有效提高了事件的并发处理能力。
Description
技术领域
本发明涉及互联网信息技术领域,尤其涉及一种基于线程和协程的事件处理方法、装置和终端设备。
背景技术
对于线程池中的事件进行处理时,现有技术中常采用的方案为:逐个对事件进行处理,且在处理长时间回调事件时采用同步调用的方法。例如在线程处理一个通话事件且该通话事件存在向第三方网页请求查询账号的回调事件时,则采用同步调用的请求方法,即线程的进程会阻塞,即停止线程的进程直到回调事件返回查询结果时,再根据返回的查询结果继续处理该线程的剩余流程,则会导致该线程处理事件的等待时间较长,从而在处理多个并发事件时需要等待每一存在回调事件的事件对应的线程完成同步请求后,再处理下一个事件,使得事件的并发处理能力低。
发明内容
本发明实施例提供一种基于线程和协程的事件处理方法、装置和终端设备,能有效解决现有技术中在处理多个并发事件时需要等待每一存在回调事件的事件对应的线程完成同步请求后,再处理下一个事件,使得事件的并发处理能力低的问题。
本发明一实施例提供一种基于线程和协程的事件处理方法,包括:
从线程的线程事件队列中获取目标事件;
在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
优选的,所述将所述目标事件发送至所述目标事件对应的第一协程,具体包括:
获取目标事件的目标字符内容,并计算所述目标字符内容的字符长度;
根据所述字符长度计算得到所述目标事件对应的协程编号;
判断所述目标事件对应的协程编号是否存在对应的协程,若存在,则将所述目标事件发送至所述目标事件对应的协程编号对应的协程,若不存在,则创建一个新的协程,将所述目标事件发送至新的协程。
优选的,所述唤醒事件或超时事件根据一长调用操作的返回状态生成,具体包括:
若在第二预设时长内检测到接收到长调用操作的返回结果值时,判定所述长调用操作的返回状态为成功,生成唤醒事件;
若在超过第二预设时长后仍未接收到长调用操作的返回结果值时,判定所述长调用操作的返回状态为失败,生成超时事件;其中,所述唤醒事件或超时事件包括所述业务事件对应的协程编号。
优选的,在确定所述目标事件的类型为唤醒事件时,所述解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,具体包括:
获取唤醒事件对应的协程编号及唤醒事件返回值;
切换到所述唤醒事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据唤醒事件返回值执行被挂起的业务事件,并逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理。
优选的,在确定所述目标事件的类型为超时事件时,所述解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,具体包括:
获取超时事件对应的协程编号及超时事件返回值;
切换到所述超时事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据超时事件返回值执行被挂起的业务事件,并逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理。
优选的,所述执行所述目标事件的事件回调操作,还包括:
若在执行所述目标事件的事件回调操作时,无需执行超过第一预设时长的长调用操作,则在目标事件执行完后,从线程的线程事件队列中获取新的目标事件。
优选的,在从线程的线程事件队列中获取目标事件后,还包括:
判断所述目标事件是否由线程创建,若所述目标事件由线程创建,则判定所述目标事件为唤醒事件或超时事件;
若所述目标事件不是由线程创建,则将所述目标事件判定为业务事件。
在上述的方法实施例的基础上,本发明对应提供了装置项实施例。
本发明一实施例提供了一种基于线程和协程的事件处理装置,包括:事件获取模块、第一事件执行模块和第二事件执行模块;
所述事件获取模块,用于从线程的线程事件队列中获取目标事件;
所述第一事件执行模块,用于在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
所述第二事件执行模块,用于在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
在上述的方法实施例的基础上,本发明对应提供了终端设备项实施例。
本发明另一实施例提供了一种终端设备,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现上述发明实施例所述的一种基于线程和协程的事件处理方法。
通过实施本发明具有如下有益效果:
本发明实施例提供了一种基于线程和协程的事件处理方法、装置和终端设备,本发明的方法通过建立一个线程和多个协程来处理多个事件,从线程的事件队列中获取一目标事件,并根据目标事件的类型来确定不同的处理方式,若目标事件的类型为业务事件则将目标事件发送至对应的协程进行处理,若在执行目标事件时需要执行事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,继而从线程的线程事件队列中获取新的目标事件,即无需让协程的进程一直阻塞直至该执行事件回调完成后才继续处理事件,而是将目标事件挂起后继续从线程的线程事件队列中获取新的目标事件进行处理;在完成超过第二预设时长的长调用操作后会生成一唤醒事件或超时事件,且唤醒事件或超时事件会被投递进入线程事件队列中等待处理,而在判断所述目标事件的类型为唤醒事件或超时事件,则获取对应的协程号,且解除所述协程号对应的协程的目标事件挂起操作,并继续处理所述协程号对应的协程的事件队列中的事件,直至所述协程事件队列为空时或所述第二协程的协程事件队列中有业务事件被挂起时,继而从线程的线程事件队列中获取新的目标事件,从而可以在线程无需发生阻塞的情况下完成多个事件的并发处理。与现有技术相比,本发明通过主线程和协程相结合的方式,在处理多个并发事件时不需要等待每一存在需要执行超过第一预设时长的长调用操作的事件对应的协程完成执行事件回调后才继续处理下一个事件,而是将存在需要执行超过第一预设时长的长调用操作对应的事件挂起后返回线程中再获取下一个事件进行处理,并随后再处理执行超过第一预设时长的长调用操作后生成的唤醒事件或超时事件,从而执行并完成各个事件的处理操作,有效提高了事件的并发处理能力。
附图说明
图1是本发明一实施例提供的一种基于线程和协程的事件处理方法的流程示意图。
图2是本发明一实施例提供的一种基于线程和协程的事件处理方法的另一流程示意图。
图3是本发明一实施例提供的一种基于线程和协程的事件处理方法的唤醒事件或超时事件的生成流程图。
图4是本发明一实施例提供的一种基于线程和协程的事件处理装置的结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1-图2所示,是本发明一实施例提供的一种基于线程和协程的事件处理方法的流程示意图,
本发明一实施例提供了的一种基于线程和协程的事件处理方法,包括:
步骤S1:从线程的线程事件队列中获取目标事件;
步骤S2:在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
步骤S3:在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
对于步骤S1,在一个优选的实施例中,从线程的线程事件队列中获取目标事件,其中,所述线程的事件队列包括若干个事件,而这些事件又分为业务事件、唤醒事件或超时事件,则会在本线程的事件队列中投递一个唤醒事件或超时事件。
需要说明的是,业务事件是从线程从外部接口获取的事件,包括通话事件等;而唤醒事件或超时事件,是在执行业务事件的时,如果执行到超过第一预设时长的长调用操作则将所述目标事件挂起后,线程再根据一长调用操作的返回状态生成的,并且线程会将该唤醒事件或超时事件投递到事件队列中。
在一个优选的实施例中,在从线程的线程事件队列中获取目标事件后,还包括:
判断所述目标事件是否由线程创建,若所述目标事件由线程创建,则判定所述目标事件为唤醒事件或超时事件;
若所述目标事件不是由线程创建,则将所述目标事件判定为业务事件。
对于步骤S2,在一个优选的实施例中,在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程,具体包括:
获取目标事件的目标字符内容,并计算所述目标字符内容的字符长度;
然后根据所述字符长度计算得到所述目标事件对应的协程编号;其中,根据预设的哈希规则将所述字符长度通过计算后得到对应的编号;
得到对应的编号后,首先判断所述目标事件对应的协程编号是否存在对应的协程,若存在,则将所述目标事件发送至所述目标事件对应的协程编号对应的协程,若不存在,则需要创建一个新的协程,然后将所述目标事件发送至新的协程。
进一步的,若是将所述目标事件发送至第一协程或新的协程,则需要判断所述第一协程或新的协程,是否存在处于挂起状态的业务事件。以将所述目标事件发送至第一协程为例,则判断所述第一协程是否存在处于挂起状态的业务事件,若否,说明第一协程处于空闲状态,可以处理业务事件,则切换至第一协程,执行所述目标事件的事件回调操作;
在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;其中,超过第一预设时长的长调用操作可以为http请求,即需要http去账户平台查询账号信息的操作,因为该操作需要等待返回值,则在等待这种类型的请求时,则将协程挂起后,返回线程,从线程的线程事件队列中获取新的目标事件,即不会使得协程和线程的进程发生阻塞,而是将有超过第一预设时长的长调用操作的协程进行挂起,再得到长调用操作的返回状态时生成唤醒事件或超时事件,然后在本线程的事件队列中投递一个唤醒事件或超时事件等待处理,继而处理对应的唤醒事件或超时事件,从而返回对应的协程处理超过第一预设时长的长调用操作对应的业务事件;
对于步骤S3,在一个优选的实施例中,在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;
如图3所示,在一个优选的实施例中,唤醒事件或超时事件根据一长调用操作的返回状态生成,具体包括:
执行事件回调操作时,若执行到超过第一预设时长的长调用操作,则会触发协程挂起的步骤(例如http操作,下面以http操作为例);
首先保存协程的上下文信息(包括当前线程id和协程编号)到回调参数中,而唤醒事件或超时事件的函数参数包含该信息;
注册一个时长为第二预设时长的http调用的超时定时器,且该定时器超时的回调参数包含该协程的上下文信息;
调用http异步操作,并在异步回调参数中包含该协程的上下信息,然后将所述目标事件挂起,
若在第二预设时长内检测到接收到http请求的操作时(长调用操作)的返回结果值时,判定所述http请求的操作的返回状态为成功,则生成唤醒事件,并将唤醒事件投递到线程的事件队列中等待处理;
若在超过第二预设时长后仍未接收到http请求的操作的返回结果值时,判定所述长调用操作的返回状态为失败,生成超时事件,并将超时事件投递到线程的事件队列中等待处理;
需要说明的是,唤醒事件或超时事件,均包括一业务事件对应的协程编号,以使线程在获取唤醒事件或超时事件时,可以获取协程编号然后切换到对应的协程中进行后的事件处理。
在一个优选的实施例中,在确定所述目标事件的类型为唤醒事件时:
获取唤醒事件对应的协程编号及唤醒事件返回值;具体的,该唤醒事件返回值可为true;
切换到所述唤醒事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据唤醒事件返回值执行被挂起的业务事件,因为唤醒事件返回值为true,则可以根据唤醒事件的返回值true,判断出有接收到长调用操作的参数返回值,则根据参数返回值继续处理后续的事件操作;在完成对应的事件处理后,然后逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件。需要说明的是,所述参数返回值是函数业务本身的返回值,其可以放在参数列表,可以以指针方式返回当前待执行的事件中。而且只有唤醒事件返回值为true(即未超时)的时候,以参数列表形式的业务本身的参数返回值才有意义并且被获取以及被执行。
在一个优选的实施例中,在确定所述目标事件的类型为超时事件时:
获取超时事件对应的协程编号及超时事件返回值;具体的,该唤醒事件返回值可为fasle;
切换到所述超时事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据超时事件返回值执行被挂起的业务事件,因为超时事件返回值为fasle,则可以根据超时事件的返回值fasle,判断出没有接收到长调用操作的参数返回值,则此时继续处理后续的事件操作,如重新请求或按对应的回调函数进行后续操作,在完成对应的事件处理后,然后逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件。
需要说明的是,上述的第一协程和第二协程中的第一、第二均是为了区别两者协程,而无实际的排序意义。
本发明不需要等待每一存在需要执行超过第一预设时长的长调用操作的事件对应的协程完成执行事件回调后才继续处理下一个事件,而是将存在需要执行超过第一预设时长的长调用操作对应的事件挂起后,返回线程中再获取下一个事件进行处理,然后再处理超过第一预设时长的长调用操作完成后生成的唤醒事件或超时事件,从而再跳转回对应的协程继续处理剩余的操作,则本发明可以执行并完成各个事件的处理操作,有效提高了事件的并发处理能力。
本发明基线程和协程的两级消息事件的框架,能够有效将异步长调用操作(例如http请求、DB请求或websocket请求)变成同步长调用操作,降低代码的复杂性提高可维护性,又同时因为协程堆栈的极低性能开销获取到(接近)等效异步回调的性能。
如图2所示,在上述各种基于线程和协程的事件处理方法的实施例的基础上,本发明对应提供了装置项实施例;
本发明一实施例提供了一种基于线程和协程的事件处理装置,包括:事件获取模块、第一事件执行模块和第二事件执行模块;
所述事件获取模块,用于从线程的线程事件队列中获取目标事件;
所述第一事件执行模块,用于在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
所述第二事件执行模块,用于在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,既可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
所属领域的技术人员可以清楚地了解到,为的方便和简洁,上述描述的装置的具体工作过程,可参考前述方法实施例中对应的过程,在此不再赘述。
在上述各种方法的实施例的基础上,本发明对应提供了终端设备项实施例。
本发明一实施例提供了一种终端设备,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现本发明任意一方法项实施例所述的一种基于线程和协程的事件处理方法的方法。
所述终端设备可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算终端设备。所述终端设备可包括,但不仅限于,处理器、存储器。
所称处理器可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述终端设备的控制中心,利用各种接口和线路连接整个终端设备的各个部分。
所述存储器可用于存储所述计算机程序,所述处理器通过运行或执行存储在所述存储器内的计算机程序,以及调用存储在存储器内的数据,实现所述终端设备的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等;存储数据区可存储根据手机的使用所创建的数据等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(Secure Digital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件或其他易失性固态存储器件。
以上所述是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围。
Claims (9)
1.一种基于线程和协程的事件处理方法,其特征在于,包括:
从线程的线程事件队列中获取目标事件;
在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
2.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,所述将所述目标事件发送至所述目标事件对应的第一协程,具体包括:
获取目标事件的目标字符内容,并计算所述目标字符内容的字符长度;
根据所述字符长度计算得到所述目标事件对应的协程编号;
判断所述目标事件对应的协程编号是否存在对应的协程,若存在,则将所述目标事件发送至所述目标事件对应的协程编号对应的协程,若不存在,则创建一个新的协程,将所述目标事件发送至新的协程。
3.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,所述唤醒事件或超时事件根据一长调用操作的返回状态生成,具体包括:
若在第二预设时长内检测到接收到长调用操作的返回结果值时,判定所述长调用操作的返回状态为成功,生成唤醒事件;
若在超过第二预设时长后仍未接收到长调用操作的返回结果值时,判定所述长调用操作的返回状态为失败,生成超时事件;其中,所述唤醒事件或超时事件包括所述业务事件对应的协程编号。
4.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,在确定所述目标事件的类型为唤醒事件时,所述解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,具体包括:
获取唤醒事件对应的协程编号及唤醒事件返回值;
切换到所述唤醒事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据唤醒事件返回值执行被挂起的业务事件,并逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理。
5.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,在确定所述目标事件的类型为超时事件时,所述解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,具体包括:
获取超时事件对应的协程编号及超时事件返回值;
切换到所述超时事件对应的协程编号对应的第二协程中,并解除所述第二协程中被挂起的业务事件;
根据超时事件返回值执行被挂起的业务事件,并逐一对所述第二协程的协程事件队列中的其余的业务事件进行处理。
6.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,所述执行所述目标事件的事件回调操作,还包括:
若在执行所述目标事件的事件回调操作时,无需执行超过第一预设时长的长调用操作,则在目标事件执行完后,从线程的线程事件队列中获取新的目标事件。
7.如权利要求1所述的一种基于线程和协程的事件处理方法,其特征在于,在从线程的线程事件队列中获取目标事件后,还包括:
判断所述目标事件是否由线程创建,若所述目标事件由线程创建,则判定所述目标事件为唤醒事件或超时事件;
若所述目标事件不是由线程创建,则将所述目标事件判定为业务事件。
8.一种基于线程和协程的事件处理装置,其特征在于,包括:事件获取模块、第一事件执行模块和第二事件执行模块;
所述事件获取模块,用于从线程的线程事件队列中获取目标事件;
所述第一事件执行模块,用于在确定所述目标事件的类型为业务事件时,将所述目标事件发送至所述目标事件对应的第一协程;判断所述第一协程是否存在处于挂起状态的业务事件,若否,则切换至第一协程,执行所述目标事件的事件回调操作,且在执行事件回调操作时,若执行到超过第一预设时长的长调用操作则将所述目标事件挂起,并切换至线程,从线程的线程事件队列中获取新的目标事件;若是,则从线程的线程事件队列中获取新的目标事件;
所述第二事件执行模块,用于在确定所述目标事件的类型为唤醒事件或超时事件时,则获取唤醒事件或超时事件对应的协程的协程编号,解除所述唤醒事件或超时事件对应的协程编号对应的第二协程中被挂起的业务事件并处理所述被挂起的业务事件,继而逐一对所述第二协程的协程事件队列中的事件进行处理,并在检测到所述第二协程的协程事件对列为空,或所述第二协程的协程事件队列中有业务事件被挂起时,从线程的线程事件队列中获取新的目标事件;其中,所述唤醒事件或超时事件根据一长调用操作的返回状态生成。
9.一种终端设备,其特征在于,包括处理器、存储器以及存储在所述存储器中且被配置为由所述处理器执行的计算机程序,所述处理器执行所述计算机程序时实现如权利要求1至7中任意一项所述的一种基于线程和协程的事件处理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310908521.6A CN116932248A (zh) | 2023-07-24 | 2023-07-24 | 一种基于线程和协程的事件处理方法、装置和终端设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310908521.6A CN116932248A (zh) | 2023-07-24 | 2023-07-24 | 一种基于线程和协程的事件处理方法、装置和终端设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116932248A true CN116932248A (zh) | 2023-10-24 |
Family
ID=88376917
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310908521.6A Pending CN116932248A (zh) | 2023-07-24 | 2023-07-24 | 一种基于线程和协程的事件处理方法、装置和终端设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116932248A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117850994A (zh) * | 2023-12-11 | 2024-04-09 | 天翼云科技有限公司 | 一种基于异步事件回调的协程调度模型与方法 |
-
2023
- 2023-07-24 CN CN202310908521.6A patent/CN116932248A/zh active Pending
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117850994A (zh) * | 2023-12-11 | 2024-04-09 | 天翼云科技有限公司 | 一种基于异步事件回调的协程调度模型与方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109104336B (zh) | 服务请求处理方法、装置、计算机设备及存储介质 | |
CN110471749B (zh) | 任务处理方法、装置、计算机可读存储介质和计算机设备 | |
CN107766160B (zh) | 队列消息处理方法及终端设备 | |
CN109189509B (zh) | 接口的调用方法、接口调用的响应方法及服务器 | |
CN109800204B (zh) | 数据分配方法及相关产品 | |
CN107995286B (zh) | 基于dubbo平台的服务自动启停方法、服务器及存储介质 | |
CN110764906A (zh) | 内存回收处理方法、装置、电子设备以及存储介质 | |
CN110737857A (zh) | 一种后端分页加速方法、系统、终端及存储介质 | |
CN116932248A (zh) | 一种基于线程和协程的事件处理方法、装置和终端设备 | |
CN111753065A (zh) | 请求响应方法、系统、计算机系统和可读存储介质 | |
CN112530074A (zh) | 排队叫号提醒方法、装置、设备及存储介质 | |
CN106550021B (zh) | 推送消息的推送方法及装置 | |
CN111597041B (zh) | 一种分布式系统的调用方法、装置、终端设备及服务器 | |
CN116361106B (zh) | 一种日志处理方法、装置、电子设备及存储介质 | |
CN108809763B (zh) | 一种网络性能参数采集方法、终端装置及存储介质 | |
CN111371536B (zh) | 一种控制指令的发送方法及装置 | |
CN111913815A (zh) | 调用请求的处理方法、装置、电子设备及可读存储介质 | |
CN111376255B (zh) | 机器人数据采集方法、装置及终端设备 | |
CN107689979B (zh) | 一种下载请求处理方法和处理设备 | |
CN114546171A (zh) | 数据分发方法、装置、存储介质及电子设备 | |
CN114374657A (zh) | 一种数据处理方法和装置 | |
CN111694628A (zh) | 基于应用程序的线程的页面展示方法及相关设备 | |
CN112306797A (zh) | 一种埋点信息上报方法、装置、存储介质及电子设备 | |
CN111475322A (zh) | 定位stuck线程的方法、装置、计算机设备及可读存储介质 | |
CN110876852A (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 |