公开/公告号CN105760237A
专利类型发明专利
公开/公告日2016-07-13
原文格式PDF
申请/专利权人 南京贝伦思网络科技股份有限公司;
申请/专利号CN201610082073.9
申请日2016-02-05
分类号G06F9/52(20060101);
代理机构32252 南京钟山专利代理有限公司;
代理人戴朝荣
地址 210017 江苏省南京市建邺区应天大街780号3幢3201-3217
入库时间 2023-06-19 00:05:15
法律状态公告日
法律状态信息
法律状态
2019-03-22
授权
授权
2016-08-17
实质审查的生效 IPC(主分类):G06F9/52 申请日:20160205
实质审查的生效
2016-07-13
公开
公开
【技术领域】
本发明属于计算机技术领域,具体地涉及一种基于协程机制的通讯方 法。
【背景技术】
在现有的计算机技术中,传统的进程间或主机间的通讯采用Socket方 式来进行。现有的Socket通讯包括两种模式:阻塞方式和非阻塞方式。
阻塞方式,也叫串行方式,是指:在一个线程或者一个函数中实现, 通过send函数发送数据后,立刻调用recv函数以阻塞的方式获取远端回应 数据。而且,在此过程中,线程一直处于等待状态,无法进行其他操作。 这种情况下,一般采用多线程来实现同一连接上的并发操作,共享的数据 采用信号量等防止访问冲突。
非阻塞的方式,也叫并行的方式,是指采用epoll或select等函数,对 连接上的数据进行接收,并调用相应函数的对数据进处理。如果某个函数 模块通过这个连接发送数据后,并不能直接收到回应,必须另外提供一个 回调函数,等真正收到回应后,调用此回调函数来处理回应数据结果。但 是,在此过程中,必须通过堆或者全局内存来保存必要的信息,同时回调 机制会导致通讯数据交互的复杂度。
因此,有必要提供一种基于协程机制的通讯方法。
【发明内容】
本发明的目的在于提供一种基于协程机制的通讯方法。
本发明的技术方案如下:一种基于协程机制的通讯方法,包括如下步 骤:
a、在主线程循环过程中,监听socket;
b、判断所述socket是否有输入数据,如果有,则执行步骤c;
c、对所述输入数据进行解码分析,并判断所述输入数据是请求数据或 回应数据,如果是请求数据,则执行步骤d,如果是回应数据,则执行步 骤e;
d、创建协程函数,并利用所述协程函数对所述请求数据进行处理;
e、根据所述回应数据查找与所述回应数据相对应的协程函数,并切换 到所述协程函数处理所述回应数据。
在本发明实施例提供的基于协程机制的通讯方法中,每一所述协程函 数对应一个用于设定所述协程函数的生命周期的定时器,且每一所述定时 器中携带有用于定位相对应的所述协程函数的消息ID。
在本发明实施例提供的基于协程机制的通讯方法中,在步骤a中,采 用select机制或者epoll机制来监听所述socket。
在本发明实施例提供的基于协程机制的通讯方法中,如果所述socket 没有输入数据,则在步骤b中还包括执行超时消息处理步骤。
在本发明实施例提供的基于协程机制的通讯方法中,所述超时消息处 理包括如下步骤:根据定时器事件到达的定时器所携带的消息ID定位超时 的协程函数;切换到所述超时的协程函数进行超时消息处理;所述超时消 息处理完成后,则切换到所述主线程继续循环,并返回步骤a。
在本发明实施例提供的基于协程机制的通讯方法中,在步骤d中,如 果在所述请求数据的处理过程中需要发送处理数据,则所述步骤d还包括 如下步骤:发送处理数据,保存所述协程函数,并建立携带有定位所述协 程函数的消息ID的定时器;切换到所述主线程继续循环,并返回步骤a。
在本发明实施例提供的基于协程机制的通讯方法中,在步骤e中包括 如下步骤:根据所述回应数据中携带的消息ID在缓存中查找与所述回应数 据相对应的协程函数;关闭与查找到的协程函数相对应的定时器,并切换 到所述查找到的协程函数处理所述回应数据;所述回应数据处理完成,则 切换到所述主线程继续循环,并返回步骤a。
本发明的有益效果在于:本发明提供的基于协程机制的通讯方法采用 协程机制进行数据处理,从而不仅可以解决阻塞方式下的等待问题,还可 以避开多线程实现的数据访问冲突;而且无需回调机制来增加复杂度,也 不需要采用堆来保存额外的信息。
此外,在所述基于协程机制的通讯方法中,由于只有一个线程运行, 则不需要多线程的锁机制,也不存在同时写变量冲突,所以执行效率比多 线程高很多。
【附图说明】
图1是本发明实施例提供的基于协程机制的通讯方法的流程示意图;
图2是本发明实施例提供的基于协程机制的通讯方法的流程框图;
图3是图2所示基于协程机制的通讯方法中超时消息处理步骤的流程 框图;
图4是图2所示基于协程机制的通讯方法中步骤S4的流程框图;
图5是图2所示基于协程机制的通讯方法中步骤S5的流程框图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图 及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体 实施例仅仅用以解释本发明,并不用于限定本发明。
除非上下文另有特定清楚的描述,本发明中的元件和组件,数量既可 以单个的形式存在,也可以多个的形式存在,本发明并不对此进行限定。 本发明中的步骤虽然用标号进行了排列,但并不用于限定步骤的先后次序, 除非明确说明了步骤的次序或者某步骤的执行需要其他步骤作为基础,否 则步骤的相对次序是可以调整的。可以理解,本文中所使用的术语“和/ 或”涉及且涵盖相关联的所列项目中的一者或一者以上的任何和所有可能 的组合。
请同时参阅图1和图2,图1是本发明实施例提供的基于协程机制的 通讯方法的流程示意图;图2是本发明实施例提供的基于协程机制的通讯 方法的流程框图。本发明提供的基于协程机制的通讯方法100完全依赖于 计算机程序,并且所述计算机程序可运行于基于冯洛伊曼体系的计算机系 统上。
其中,协程(coroutine)通常又被称为微线程和纤程等。而且,协程 不像线程或进程运行在操作系统底层,由操作系统统一创建、调度、管理 和注销,而是运行在应用程序的内存空间中(用户空间中),创建、调度、 管理和注销协程的操作由应用程序进行,操作系统则对其并不知晓也不干 涉。也就是说,协程是建立在操作系统上层的应用层的一种多线程机制。 现有的多种编程语言均提供了协程机制,例如Lua、ruby和GoogleGO等。
而且,在本实施例中,每一协程函数对应一个用于设定所述协程函数 的生命周期的定时器,且每一所述定时器中携带有用于定位相对应的所述 协程函数的消息ID。
本发明提供的基于协程机制的通讯方法100包括:
步骤S1、在主线程循环过程中,监听socket。
具体地,所述socket作为BSDUNIX的进程通信机制,用于描述IP地 址和端口,可以用来实现不同虚拟机或不同计算机之间的通信。
在socket通讯过程中,所述socket不仅可以通过系统I/O接口接收请 求数据,还可以通过所述系统I/O接口接收回应数据;而且,可选择地, 在处理所述请求数据的过程中,socket还可以通过所述系统I/O接口发送 处理数据。优选地,在本实施例中,采用select机制或者epoll机制来监听 所述socket。
步骤S2、判断所述socket是否有输入数据,如果有,则执行步骤S3; 如果没有,则执行超时消息处理步骤。
具体地,在所述步骤S2中,如果所述socket有输入数据,则所述输 入数据可以是请求数据,也可以是回应数据,需要执行步骤S3进行判断。
如果所述socket没有输入数据,则可能会导致在某一所述协程函数的 生命周期内没有接收到数据,而出现定时器事件到达,则相对应地需要执 行超时消息处理步骤。请参阅图3,是图2所示基于协程机制的通讯方法 中超时消息处理步骤的流程框图。在本实施例中,所述超时消息处理包括 如下步骤:
步骤S21、根据定时器事件到达的定时器所携带的消息ID定位超时的 协程函数;
步骤S22、切换到所述超时的协程函数进行超时消息处理;
步骤S23、所述超时消息处理完成后,则切换到所述主线程继续循环, 并返回步骤S1。
其中,在所述步骤S21中,通过所述消息ID查找到所述超时的协程函 数可以采用Hash算法来实现。
步骤S3、对所述输入数据进行解码分析,并判断所述输入数据是请求 数据或回应数据,如果是请求数据,则执行步骤S4,如果是回应数据,则 执行步骤S5。
具体地,所述输入数据包含消息ID,并且所述消息ID是判断所述输 入数据属于所述请求数据或所述回应数据的标志。当所述socket收到一个 所述输入数据时,对所述输入数据进行解码分析以提取所述消息ID,并根 据所述输入数据中的消息ID来判断所述输入数据的类型。
步骤S4、创建协程函数,并利用所述协程函数对所述请求数据进行处 理。
请参阅图4,是图2所示基于协程机制的通讯方法中步骤S4的流程框 图。具体地,在所述步骤S4中,根据所述请求数据的内容而创建相对应的 协程函数;而且,还需要判断在所述协程函数处理所述请求数据的过程中 是否需要发送处理数据。如果不需要发送所述处理数据,则所述步骤S4 包括如下步骤:
步骤S411、切换到所述协程函数处理所述请求数据;
步骤S412、如果所述请求数据处理完成,则切换到所述主线程继续循 环,并返回步骤S1。
进一步地,如果需要发送所述处理数据,则所述步骤S4还可以包括如 下步骤:
步骤S421、发送所述处理数据,保存所述协程函数,并建立携带有定 位所述协程函数的消息ID的定时器;
步骤S422、切换到所述主线程继续循环,并返回步骤S1。
其中,发送完成所述处理数据后,所述协程函数进入等待所述回应数 据到达或者所述定时器事件到达的状态。而且,应当理解,在发送所述处 理数据的过程中,在所述发送的处理数据中可以携带有所述消息ID,用作 所述发送的处理数据的回应标志。
步骤S5、根据所述回应数据查找与所述回应数据相对应的协程函数, 并切换到所述协程函数处理所述回应数据。
请参阅图5,是图2所示基于协程机制的通讯方法中步骤S5的流程框 图。由于所述回应数据携带有用于定位协程函数的消息ID,则在所述步骤 S5中包括如下步骤:
步骤S51、根据所述回应数据中携带的消息ID在缓存中查找与所述回 应数据相对应的协程函数;
步骤S52、关闭与查找到的协程函数相对应的定时器,并切换到所述 查找到的协程函数处理所述回应数据;
步骤S53、所述回应数据处理完成,则切换到所述主线程继续循环, 并返回步骤S1。
相较于现有技术,本发明提供的基于协程机制的通讯方法100采用协 程机制进行数据处理,从而不仅可以解决阻塞方式下的等待问题,还可以 避开多线程实现的数据访问冲突;而且无需回调机制来增加复杂度,也不 需要采用堆来保存额外的信息。
此外,在所述基于协程机制的通讯方法100中,由于只有一个线程运 行,则不需要多线程的锁机制,也不存在同时写变量冲突,所以执行效率 比多线程高很多。
对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细 节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体 形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性 的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限 定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化囊括 在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要 求。
此外,应当理解,虽然本说明书按照实施方式加以描述,但并非每个 实施方式仅包含一个独立的技术方案,说明书的这种叙述方式仅仅是为清 楚起见,本领域技术人员应当将说明书作为一个整体,各实施例中的技术 方案也可以经适当组合,形成本领域技术人员可以理解的其他实施方式。
机译: 基于差分堆栈的对称协程
机译: 协程监控方法和装置
机译: 使用协程提供远程过程呼叫服务的方法和装置