skynet框架应用 (一) skynet介绍
1 skynet介绍
Skynet 是一个基于C跟lua的开源服务端并发框架,这个框架是单进程多线程Actor模型。是一个轻量级的为在线游戏服务器打造的框架。
我在云风博客的基础上,把重要的知识点加上具体的example来讲解skynet如何去使用。前面的比较啰嗦一些,大家不想了解这些知识的,可以直接跳转到第二章节。
1.1 简介
这个系统是单进程多线程模型。
每个服务都是严格的被动的消息驱动的,以一个统一的 callback 函数的形式交给框架。框架从消息队列里调度出接收的服务模块,找到 callback 函数入口,调用它。服务本身在没有被调度时,是不占用任何 CPU 的。
skynet虽然支持集群,但是作者云风主张能用一个节点完成尽量用一个节点,因为多节点通信方面的开销太大,如果一共有 100 个 skynet 节点,在它们启动完毕后,会建立起 9900条通讯通道。
1.2 特点
Skynet框架做两个必要的保证:
一、一个服务的 callback 函数永远不会被并发。
二、一个服务向另一个服务发送的消息的次序是严格保证的。
用多线程模型来实现它。底层有一个线程消息队列,消息由三部分构成:源地址、目的地址、以及数据块。框架启动固定的多条线程,每条工作线程不断从消息队列取到消息,调用服务的 callback 函数。
线程数应该略大于系统的 CPU 核数,以防止系统饥饿。(只要服务不直接给自己不断发新的消息,就不会有服务被饿死)
对于目前的点对点消息,要求发送者调用 malloc 分配出消息携带数据用到的内存;由接受方处理完后调用 free 清理(由框架来做)。这样数据传递就不需要有额外的拷贝了。
做为核心功能,Skynet 仅解决一个问题:
把一个符合规范的 C 模块,从动态库(so 文件)中启动起来,绑定一个永不重复(即使模块退出)的数字 id 做为其 handle 。模块被称为服务(Service),服务间可以自由发送消息。每个模块可以向 Skynet 框架注册一个 callback 函数,用来接收发给它的消息。每个服务都是被一个个消息包驱动,当没有包到来的时候,它们就会处于挂起状态,对 CPU 资源零消耗。如果需要自主逻辑,则可以利用 Skynet 系统提供的 timeout 消息,定期触发。
1.3 Actor模型
1.3.1 Actor模型介绍
**Actor模型内部的状态由它自己维护即它内部数据只能由它自己修改(通过消息传递来进行状态修改),所以使用Actors模型进行并发编程可以很好地避免这些问题,Actor由状态(state)、行为(Behavior)和邮箱(mailBox)三部分组成**
状态(state):Actor中的状态指的是Actor对象的变量信息,状态由Actor自己管理,避免了并发环境下的锁和内存原子性等问题
行为(Behavior):行为指定的是Actor中计算逻辑,通过Actor接收到消息来改变Actor的状态
邮箱(mailBox):邮箱是Actor和Actor之间的通信桥梁,邮箱内部通过FIFO消息队列来存储发送方Actor消息,接受方Actor从邮箱队列中获取消息
Actor的基础就是消息传递,skynet中每个服务就是一个LUA虚拟机,就是一个Actor。
1.3.2 Actor模型好处
事件模型驱动: Actor之间的通信是异步的,即使Actor在发送消息后也无需阻塞或者等待就能够处理其他事情。
强隔离性: Actor中的方法不能由外部直接调用,所有的一切都通过消息传递进行的,从而避免了Actor之间的数据共享,想要观察到另一个Actor的状态变化只能通过消息传递进行询问。
位置透明: 无论Actor地址是在本地还是在远程机上对于代码来说都是一样的。
轻量性:Actor是非常轻量的计算单机,只需少量内存就能达到高并发。
skynet框架应用 (一) skynet介绍相关推荐
- skynet框架的设计结构
前言:skynet 是一个为网络游戏服务器设计的轻量框架.当然,它并不只是用于游戏服务器框架,不过,作为一个游戏开发者,自然是把skynet当做一个游戏服务框架来看待,更何况我是一个后台服务器开发的程 ...
- skynet框架应用 (十二) snax框架
12 snax框架 snax 是一个方便 skynet 服务实现的简单框架.(简单是相对于 skynet 的 api 而言) 使用 snax 服务先要在 Config 中配置 snax 用于路 ...
- skynet 框架snax源码分析----变量注入
skynet为了简化服务的编写,推出了snax框架,源码里也有一个例子pingserver.这是snax原创文章的第一篇,所以先就分析snax框架里的interface.lua源码,它的实现应用了一个 ...
- skynet框架应用 (八) Multicast组播
8 Multicast组播 8.1 Multicast介绍 local mc = require "skynet.multicast" 引入 multicast 模块后,你可以 ...
- 【skynet学习笔记】skynet的目录结构
[skynet学习笔记]skynet的目录结构 skynet目录结构 学习skynet必须先了解一下skynet的目录结构. skynet的目录结构十分清晰,一目了然. 下面来具体看看各个目录. [r ...
- Ext2.0框架的Grid使用介绍(转)
Ext2.0框架的Grid使用介绍 最近空闲时间在学习Ext2.0框架,只有一个字的感叹"强",我从未想到JS代码能够写出这么绚丽的Web页面出来,以前看到YUI,惊若天人,如今 ...
- TF:tensorflow框架中常用函数介绍—tf.Variable()和tf.get_variable()用法及其区别
TF:tensorflow框架中常用函数介绍-tf.Variable()和tf.get_variable()用法及其区别 目录 tensorflow框架 tensorflow.Variable()函数 ...
- 直播 | 清华大学王晨阳:轻量级Top-K推荐框架及相关论文介绍
「PW Live」是 PaperWeekly 的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和交流可能会让知识的传播更加有意义, ...
- xmpp整理笔记:xmppFramework框架的导入和介绍
一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速 ...
最新文章
- halcon 旋转_HALCON高级篇:3D相机标定(2/3)
- 成功解决OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor
- Codeforces Round #345 (Div. 2)
- 商品pid是什么意思_0基础搞懂自动驾驶传统算法与深度学习的鸿沟-PID控制算法与MLP优化方法...
- Mr.J-- HTTP学习笔记(八)-- 网关
- mysql 完整性概念_mysql基础知识
- 为什么中国有很大一部分人不愿使用windows10?
- Cisco Packet Tracer 思科模拟器中路由器的DHCP配置
- 保护电路:简单的限流保护电路图
- 北航超算运行matlab,工信部网:北航学子荣获ASC19世界大学生超算竞赛最高计算性能奖...
- fastadmin 微信支付宝整合插件 支付宝APP支付 ALIN10146
- C++ 二元一次不定方程巧妙求解——运用扩展欧几里得算法
- 计算机主机光盘故障,电脑开机之后提示插入安装光盘的解决方法
- java全国二级考点,java计算机全国二级考试时间
- 2022 年超详细过程步骤讲解 CentOS 7 安装Maven。以及Mavne配置文件的修改
- 互联网 IT 精英:龙泉寺静心之旅 1
- 中国的数字化转型 China’s digital transformation
- k8s(kubernetes)通过yaml从harbor拉取镜像(史诗级,保姆级)
- mobot_room.world-ROS2Gazebo9附1
- 16.停车场车位识别