Skynet 开源并发框架开源项目

我要开发同款
匿名用户2013年08月07日
78阅读
所属分类C/C++、程序开发、并发/并行处理框架
授权协议MIT

作品详情

Skynet是一个基于Actor模式的开源并发框架。

skynet节点,通过master,认识网络中所有其它skynet节点。它们相互一一建立单向通讯通道。也就是说,如果一共有100个skynet节点,在它们启动完毕后,会建立起1万条通讯通道。

这个系统是单进程多线程模型。

每个内部服务的实现,放在独立的动态库中。由动态库导出的三个接口createinitrelease来创建出服务的实例。init可以传递字符串参数来初始化实例。比如用lua实现的服务(这里叫snlua),可以在初始化时传递启动代码的lua文件名。

每个服务都是严格的被动的消息驱动的,以一个统一的callback函数的形式交给框架。框架从消息队列里取到消息,调度出接收的服务模块,找到callback函数入口,调用它。服务本身在没有被调度时,是不占用任何CPU的。框架做两个必要的保证。

一、一个服务的callback函数永远不会被并发。

二、一个服务向两一个服务发送的消息的次序是严格保证的。

我用多线程模型来实现它。底层有一个线程消息队列,消息由三部分构成:源地址、目的地址、以及数据块。框架启动固定的多条线程,每条工作线程不断的从消息队列取到消息。根据目的地址获得服务对象。当服务正在工作(被锁住)就把消息放到服务自己的私有队列中。否则调用服务的callback函数。当callback函数运行完后,检查私有队列,并处理完再解锁。

线程数应该略大于系统的CPU核数,以防止系统饥饿。(只要服务不直接给自己不断发新的消息,就不会有服务被饿死)

由于我们是在同一个进程内工作的。所以我对消息传递做了一点优化。对于目前的点对点消息,要求发送者调用malloc分配出消息携带数据用到的内存;由接受方处理完后调用free清理(由框架来做)。这样数据传递就不需要有额外的拷贝了。

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论