Skynet 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
Skynet 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
Skynet 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
Skynet 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
Skynet 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !

软件简介

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 仓库里某个特定版本起个有意义的名字并无太大意义,因为我也不会刻意去维护一个所谓稳定版。但在 issues 中还是发现有一些同学还在基于上个 1....

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 万条通讯通道。 暂无该版本的改进记录,持续关注,可以点击这里。 下载地址: Source code (zip) Source code ...

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

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

拖了很久,终于决定给 skynet 1.0.0 封版了。比预期的时间 足足晚了半年,好在还是在 2015 年把这个事情启动了。 其实已经很久没有对已有特性做修改了,如果的项目是在今年 3 月份以后跟进的 1.0 alpha 版的话,升级到目前的最新版本应该不会有太大痛苦。最近几个月几乎没有增加新的特性,反而是在裁减一些多余的,用的人不多的东西(为了兼容,把这样一些 API 移到了一些独立的模块中,方便废弃)。 据我所知,skynet 用于的商...

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

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

距离 skynet 开源项目的公布 已经有 20 月+ 了,如果从闭源阶段算起,已经超过了 30 个月。在我们公司内部有五个项目使用 skynet 开发,据有限的了解,在我们公司之外,至少有两个正式项目使用了相当长的时间。是时候发布一个正式版了。 今天 skynet 的第一个正式版本 v0.1.0 发布了。 在发布之前,我花了几天时间帮助公司内部的项目合并代码。最后全部统一使用这个版本。而在此之前,每个项目都是由一个负责人 fork 出一份,根...

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的结构如下,创建一个服务时,会构建一个skynet上下文skynet_context,然后把该ctx存放到handle_storage(skynet_handle.c)里。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 the dynamic shared object (shared library) file named by the null-terminated string filename and retu...

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启动时会启动一个monitor线程,用来监测各个工作线程。5s循环一次,调用skynet_monitor_check()检测工作线程...

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; 8 skynet_initthread(THREAD_TIMER); 9 for (;;) { 10 skynet_updatetime(); 11 ...

0
1
2018/06/27 00:28

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

# Hello, Skynet! Skynet这名字让我想起了经典科幻电影《终结者》里毁灭人类世界的终极人工智障,skynet的官方文档是挺给力的,但是没有那么好的引导机制,看了半天的文档还是不知道该怎么用skynet去写个最简单的Hello world,于是我就对着各种example试了半天。。 ## 正文 skynet 不能被 install 到其他地方去,别想了。先写出Hello world再考虑其他问题吧。 这里就一口气搭建一个完整的project模板。 ```shell # 创建目录并初...

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类型。 //skynet_start.c struct skynet_context *ctx = skynet_context_new(config->logservice, config...

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

Skynet Cluster 简介

# Skynet Cluster 简介 Cluster 模块负责 Skynet 节点之间的通信。 ## Cluster 概述 ``` | --- --- ---> | node1 | | node2 | <-- --- --- | ``` 两个节点之间通信最多会创建 **2 条 TCP 链路**。如上图所示。 * 节点 *node1* 主动向 *node2* 发起通信和 *node2* 的回应是**一条 TCP 链接**。 * 节点 *node2* 主动向 *node1* 发起通信和 *node1* 的回应是**另一条 TCP 链接**。 Cluster 模块包含三个服务:**clusterd** **clus...

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

skynet 阅读笔记

https://github.com/cloudwu/skynet #### skynet 整体代码分为3个部分: 1: skynet-src 核心网络层 2: service-src 服务层 3: service 使用lua实现的服务 #### skynet 实现是一套Actor模式的网络架构,Actor 中核心的概念包括: Worker 工作执行器 Actor 封装了上下文的相关服务实现 master 调度分配器 #### 在skynet的核心网络层中,主要包含: worker的实现 module的加载, 用于支持actor的实现 网络分发和监听 以及相关w...

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

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

这阵子使用kbengine+unity做的游戏。一款mmorpg的移动端网络游戏,采用大世界即时战斗方式。 这个游戏有两个职业,每个职业有三个技能。战士的血量和防御比较强,有近程打击和吸血的技能;法师血少攻击距离远,具有远程攻击和治疗的技能。 左下角是控制手柄,视角会随着人物方向变换,点击视角可以瞬间完成变换,右下角是技能按钮和切换对象按钮用来选择对象并攻击或援助。 点选怪物或者玩家左上角会出现血条和名字,表示已选中...

3
5
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
0 评论
104 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部