Skynet 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Skynet 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票

软件简介

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

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

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

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

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

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

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

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

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

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

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (0)

加载中
更多评论
发表于软件架构专区
2018/11/06 13:01

Skynet 1.2.0 发布,轻量级在线游戏框架

今天 Skynet 的作者云风在其博客宣布推出 skynet 1.2.0。Skynet 是一个轻量级的在线游戏框架,它也可以用于许多其他领域。 下载地址:https://github.com/cloudwu/skynet/releases/tag/v1.2.0 以下内容来自 云风的 BLOG 距离上次发布 1.1.0 已经有一年了。虽然我觉得给 skynet github 仓库里某个特定版本起个有意义的名字...

3
16
发表了资讯
2016/07/12 00:00

Skynet 1.0.0 正式发布,开源并发框架

Skynet 1.0.0 正式发布了。经历了 5 个 RC 版后,skynet 终于迎来了第一个正式发布版 1.0.0 。 Skynet 是一个基于 Actor 模式的开源并发框架。 skynet 节点,通过 master ,认识网络中所有其它 skynet 节点。它们相互一一建立单向通讯通道。也就是说,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 1 万条...

4
25
发表了资讯
2015/12/29 00:00

Skynet 1.0.0 RC 版发布,开源并发框架

拖了很久,终于决定给 skynet 1.0.0 封版了。比预期的时间 足足晚了半年,好在还是在 2015 年把这个事情启动了。 其实已经很久没有对已有特性做修改了,如果的项目是在今年 3 月份以后跟进的 1.0 alpha 版的话,升级到目前的最新版本应该不会有太大痛苦。最近几个月几乎没有增加新的特性,反而是在裁减一些多余的,用的人...

7
32
发表了资讯
2014/04/23 00:00

开源并发框架 Skynet 发布第一个正式版 v0.1.0

距离 skynet 开源项目的公布 已经有 20 月+ 了,如果从闭源阶段算起,已经超过了 30 个月。在我们公司内部有五个项目使用 skynet 开发,据有限的了解,在我们公司之外,至少有两个正式项目使用了相当长的时间。是时候发布一个正式版了。 今天 skynet 的第一个正式版本 v0.1.0 发布了。 在发布之前,我花了几天时间帮助公...

6
30
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
2018/01/19 11:31

skynet源码分析之skynet_server

skynet是以服务为主体进行运作的,服务称作为skynet_context(简称ctx),是一个c结构,是skynet里最重要的结构,整个skynet的运作都是围绕ctx进行的。skynet_server提供的api主要分两大类: 1.对ctx的一系列操作,比如创建,删除ctx等 2.如何发送消息和处理自身的消息 1.对ctx的一系列操作 ctx的结构如下,创建一个服务时...

0
0
发表了博客
2018/01/11 21:33

skynet源码分析之skynet_module

skynet_module提供一个模板来实现各种不同类型的c服务,比如,snlua(最常见),logger,gate等。 先说明两个linux系统函数: // dlopen函数用来获取so库的访问句柄。本质是将so库加载到内存中,并返回一个可以访问该内存块的句柄 void *dlopen(const char *filename, int flags); //The function dlopen() loads t...

0
0
发表了博客
2018/07/13 17:02

skynet源码分析之skynet_monitor

使用skynet框架中,偶尔会遇到A message from [ :0000000b ] to [ :0000000c ] maybe in an endless loop (version = 13187)类似的error,意思是0000000c服务处理0000000b服务发过来的某条消息时可能陷入死循环。出现这种error的原因:业务层发生死循环或者比较耗时(超过5s)。这就是skyent_monitor的作用。 1. skynet启...

0
0
2018/06/27 00:28

skynet 入门笔记(1):Hello, skynet!

Hello, Skynet! Skynet这名字让我想起了经典科幻电影《终结者》里毁灭人类世界的终极人工智障,skynet的官方文档是挺给力的,但是没有那么好的引导机制,看了半天的文档还是不知道该怎么用skynet去写个最简单的H...

0
0
发表了博客
2018/03/06 20:02

skynet源码分析之定时器skynet_timer.c

skynet自带定时器功能skynet-src/skynet_timer.c,在skynet启动时会创建一个线程专门跑定时器。每帧(0.0025秒/帧)调用skynet_updatetime() 1 // skynet-src/skynet_start.c 2 3 create_thread(&pid[1], thread_timer, m); 4 5 static void * 6 thread_timer(void *p) { 7 struct monitor * m = p; ...

0
0
发表了博客
2018/01/20 11:21

skynet源码分析之service_logger,skynet_error

service_srv目录是依附skynet核心模块的c服务模板,如用于日志输出的logger服务,用于运行lua脚本的snlua服务等,编译成so库供skynet框架使用。logger服务(service_logger.c)功能简单,通过了解其工作方式来熟悉skynet的工作流程。在skynet启动时,会启动一个"logger"服务,默认是logger类型服务,当然也可以配置成snlua...

0
0
发表了博客
2018/06/20 16:44

skynet:cluster

skynet跟mq扮演的角色类似,每个skynet进程维护了一个MQ,会dispatch msg到每个skynet_context的私有mq。有skynet就没必要再在自己项目里引入MQ了。 skynet 支持两种集群模式。 master/slave 模式(局域网) 当单台机器的处理能力达到极限后,可以考虑通过内置的 master/slave 机制来扩展。具体的配置方法见 Config 。 ...

0
0
发表于游戏开发专区
2019/12/06 14:28

Skynet Cluster 简介

Skynet Cluster 简介 Cluster 模块负责 Skynet 节点之间的通信。 Cluster 概述 | --- --- ---> | node1 | | node2 | <-- --- --- | 两个节点之间通信最多会创建 2 条 TCP 链路。如上图...

0
0
发表于游戏开发专区
2015/08/20 13:07

skynet 阅读笔记

skynet,网络游戏,服务器

0
2
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了问答
2016/03/12 14:08

这阵子使用kbengine+unity做的游戏(mmo物品系统,装备系统,战斗系统,聊天系统完成)

这阵子使用kbengine+unity做的游戏。一款mmorpg的移动端网络游戏,采用大世界即时战斗方式。 这个游戏有两个职业,每个职业有三个技能。战士的血量和防御比较强,有近程打击和吸血的技能;法师血少攻击距离远,具有远程攻击和治疗的技能。 左下角是控制手柄,视角会随着人物方向变换,点击视角可以瞬间完成变换,右下角是...

3
5
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
101 收藏
分享
返回顶部
顶部