一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质技术方案

技术编号:24964746 阅读:16 留言:0更新日期:2020-07-21 15:07
本发明专利技术涉及一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质,通过任务队列循环机制和回调通知机制,实现同步且不阻塞的线程工作模式。能保证线程在异步消息到来之前不会继续执行当前调用栈,并且不会造成无响应状态,实现方式简单,不与当前线程具体业务逻辑耦合。

【技术实现步骤摘要】
一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质
本专利技术涉及软件工程领域,具体涉及一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质。
技术介绍
线程阻塞是线程在执行耗时操作时处于无响应状态,无法处理线程中其他任务。异步函数是执行函数调用后立即返回,但操作的结果在未来某个时刻通知调用方。程序的运行实际是由若干线程完成的,这其中包括主线程和其他工作线程。线程有时需要等待某个异步函数调用结果后再继续运行当前调用栈,而这些异步函数结果是在未来某个不确定时间返回的,这就导致线程需要处于等待状态,而该过程会造成该线程阻塞无响应。现有办法首先在异步消息来临时再执行线程的后续操作,该方法存在后续操作不易封装界定的问题,同时也将增大线程逻辑和异步函数的耦合,且短暂容忍线程阻塞。
技术实现思路
鉴于现有技术存在的问题,本专利技术的目的是提供一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质,结合任务队列循环机制和回调通知机制,实现同步且不阻塞的线程工作模式。为了实现上述目的,本专利技术采用的技术方案为一种不阻塞线程等待异步消息的方法,所述方法包括以下步骤:S1、在线程中创建任务队列TaskQueue,所述任务队列中设有节点将线程中需要执行的各类任务进行封装,所述各类任务被封装为函数对象Task;S2、线程开启后创建第一循环函数查找所述任务队列中待执行的Task,并进行执行;S3、任务列表中执行任一Task时若需要调用异步函数,则在异步函数被调用前,创建互斥对象,开始执行异步函数时,运用互斥对象进行标记;S4、在异步函数调用后,创建第二循环函数,通过第二循环函数调用互斥对象进行判断异步函数是否执行完毕,若异步函数未执行完毕,则获取线程任务队列,继续执行步骤S2,若执行完毕,则停止第二循环函数,继续执行调用栈的后续操作。在上述技术方案中,所述步骤S2中线程中若未找到待执行Task,则进入休眠状态,等待新的Task。在上述技术方案中,所述步骤S3标记异步函数包括以下步骤:S31、在异步函数调用前,通过调用互斥对象中Lock函数进行加锁,即标记异步函数开始执行;S32、当异步函数执行结束后,回调通知消息中调用互斥对象中的UNLock函数进行解锁,即标记异步函数执行完毕。在上述技术方案中,所述步骤S4通过调用互斥对象中的TryLock函数,进行非阻塞的判断异步函数是否执行完毕。在上述技术方案中,判断异步函数执行完毕包括以下步骤:S41、若TryLock函数返回False,则表示异步函数尚未执行完毕;S42、若TryLock函数返回True,则表示异步函数执行完毕。本专利技术还公开一种不阻塞线程等待异步消息的系统,所述系统包括创建模块、查找模块、标记模块以及执行模块;创建模块,用于在线程中创建任务队列TaskQueue,所述任务队列中设有节点将线程中需要执行的各类任务进行封装,所述各类任务被封装为函数对象Task;查找模块,用于线程开启后创建第一循环函数查找所述任务队列中待执行的Task,并进行执行;标记模块,用于任务列表中执行任一Task时若需要调用异步函数,则在异步函数被调用前,创建互斥对象,开始执行异步函数时,运用互斥对象进行标记;执行模块,用于在异步函数调用后,创建第二循环函数,通过第二循环函数调用互斥对象进行判断异步函数是否执行完毕,若异步函数未执行完毕,则获取线程任务队列,继续执行查找模块,若执行完毕,则停止第二循环函数,继续执行调用栈的后续操作。在上述技术方案中,所述标记模块包括:Lock模块,用于在异步函数调用前,通过调用互斥对象中Lock函数进行加锁,即标记异步函数开始执行;UNLock模块,用于当异步函数执行结束后,回调通知消息中调用互斥对象中的UNLock函数进行解锁,即标记异步函数执行完毕。在上述技术方案中,所述执行模块中包括:False模块,用于判断若TryLock函数返回False,则表示异步函数尚未执行完毕;True模块,用于判断若TryLock函数返回True,则表示异步函数执行完毕。本专利技术还公开一种不阻塞线程等待异步消息的系统的服务器,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述任一项所述一种不阻塞线程等待异步消息的方法的步骤。本专利技术还公开一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述任一项所述一种不阻塞线程等待异步消息的方法的步骤。本专利技术一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质,具有以下有益效果:本专利技术通过结合任务队列循环机制和回调通知机制,实现同步且不阻塞的线程工作模式,能保证线程在异步消息到来之前不会继续执行当前调用栈,并且不会造成无响应状态,实现方式简单,不与当前线程具体业务逻辑耦合。附图说明图1为本专利技术实施例一提供的一种不阻塞线程等待异步消息的方法的流程图;图2本专利技术实施例二提供一种不阻塞线程等待异步消息的系统模块图;图3为本专利技术实施例三提供的服务器的结构示意图。具体实施方式本专利技术提供一种不阻塞线程等待异步消息的方法、系统、服务器及存储介质。为使得本专利技术的专利技术目的、特征、优点能够更加的明显和易懂,下面将结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本专利技术一部分实施例,而非全部的实施例。基于本专利技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本专利技术保护的范围。本专利技术如图1所示实施例一提供一种不阻塞线程等待异步消息的方法,所述方法包括以下步骤:S1、在线程中创建任务队列TaskQueue,所述任务队列中设有节点将线程中需要执行的各类任务进行封装,所述各类任务被封装为函数对象Task;其中,任务队列TaskQueue负责开始任务、添加任务、清空任务、开始任务回调、完成队列中所有任务回调、下一个任务、当前任务进度以及队列存储所有任务。S2、线程开启后创建第一循环函数查找所述任务队列中待执行的Task,并进行执行;可选的,第一循环函数为While函数。其中,所述步骤S2中线程中若未找到待执行Task,则进入休眠状态,等待新的Task。S3、任务列表中执行任一Task时若需要调用异步函数,则在异步函数被调用前,创建互斥对象,开始执行异步函数时,运用互斥对象进行标记;可选的,创建的互斥对象为Mutex,互斥(Mutex)是一种用途非常广泛的内核对象。能够保证多个线程对同一共享资源的互斥访问。同临界区有些类似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都本文档来自技高网...

【技术保护点】
1.一种不阻塞线程等待异步消息的方法,其特征在于,所述方法包括以下步骤:/nS1、在线程中创建任务队列TaskQueue,所述任务队列中设有节点将线程中需要执行的各类任务进行封装,所述各类任务被封装为函数对象Task;/nS2、线程开启后创建第一循环函数查找所述任务队列中待执行的Task,并进行执行;/nS3、任务列表中执行任一Task时若需要调用异步函数,则在异步函数被调用前,创建互斥对象,开始执行异步函数时,运用互斥对象进行标记,;/nS4、在异步函数调用后,创建第二循环函数,通过第二循环函数调用互斥对象进行判断异步函数是否执行完毕,若异步函数未执行完毕,则获取线程任务队列,继续执行步骤S2,若执行完毕,则停止第二循环函数,继续执行调用栈的后续操作。/n

【技术特征摘要】
1.一种不阻塞线程等待异步消息的方法,其特征在于,所述方法包括以下步骤:
S1、在线程中创建任务队列TaskQueue,所述任务队列中设有节点将线程中需要执行的各类任务进行封装,所述各类任务被封装为函数对象Task;
S2、线程开启后创建第一循环函数查找所述任务队列中待执行的Task,并进行执行;
S3、任务列表中执行任一Task时若需要调用异步函数,则在异步函数被调用前,创建互斥对象,开始执行异步函数时,运用互斥对象进行标记,;
S4、在异步函数调用后,创建第二循环函数,通过第二循环函数调用互斥对象进行判断异步函数是否执行完毕,若异步函数未执行完毕,则获取线程任务队列,继续执行步骤S2,若执行完毕,则停止第二循环函数,继续执行调用栈的后续操作。


2.根据权利要求1所述一种不阻塞线程等待异步消息的方法,其特征在于,所述步骤S2中线程中若未找到待执行Task,则进入休眠状态,等待新的Task。


3.根据权利要求1所述一种不阻塞线程等待异步消息的方法,其特征在于,所述步骤S3标记异步函数包括以下步骤:
S31、在异步函数调用前,通过调用互斥对象中Lock函数进行加锁,即标记异步函数开始执行;
S32、当异步函数执行结束后,回调通知消息中调用互斥对象中的UNLock函数进行解锁,即标记异步函数执行完毕。


4.根据权利要求1所述一种不阻塞线程等待异步消息的方法,其特征在于,所述步骤S4通过调用互斥对象中的TryLock函数,进行非阻塞的判断异步函数是否执行完毕。


5.根据权利要求4所述一种不阻塞线程等待异步消息的方法,其特征在于,判断异步函数执行完毕包括以下步骤:
S41、若TryLock函数返回False,则表示异步函数尚未执行完毕;
S42、若TryLock函数返回True,则表示异步函数执行完毕。


6.一种不阻塞线程等待异步消息的系统,其特征在于,所述系统包括创建模块、查找模块、标记...

【专利技术属性】
技术研发人员:刘迟
申请(专利权)人:武汉瓯越网视有限公司
类型:发明
国别省市:湖北;42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1