skynet 入门篇

文章目录

概述

skynet 是一个轻量级服务器框架,而不仅仅用于游戏;

轻量级有以下几个方面:

1.实现了actor模型

它实现了actor模型,以及相关的脚手架(工具集);

  1. actor间数据共享机制;
  2. c服务扩展机制;

2.实现了服务器的基础组件

它实现了服务器的基础组件;

  1. 实现了reactor并发网络库;并提供了大量连接的接入方案;
  2. 基于自身网络库,实现了常用的数据库驱动(异步连接方案),并融合了lua数据结构;
  3. 实现了网关服务
  4. 时间轮用于处理定时消息;

环境准备

centos

bash 复制代码
yum install -y git gcc readline-devel autoconf

ubuntu

bash 复制代码
apt-get install git build-essential readline-dev autoconf
# 或者
apt-get install git build-essential libreadline-dev autoconf

mac

bash 复制代码
brew install git gcc readline autoconf

编译安装

bash 复制代码
git clone https://github.com/cloudwu/skynet.git
cd skynet
# centos or ubuntu
make linux
# mac
make macosx

Actor

skynet采用c++ lua实现actor并发模型;底层也是通过采用多少个核心开启多少个内核线程来充分利用多核;

Actor模型

有消息的actor为活跃的actor,没有消息为非活跃的actor;

定义

  1. 用于并行计算
  2. Actor是最基本的计算单元
  3. 基于消息计算
  4. Actor通过消息进行沟通;

组成

  • 隔离的环境
    主要通过lua虚拟机来实现;
  • 消息队列
    用来存放有序(先后到达)的消息;
  • 回调函数
    用来运行Actor;从Actor的消息队列中取出消息,并作为该回调函数的参数来运行Actor;

Actor调度

actor的调度是由线程池的调度来驱动的;

工作线程流程

工作线程从全局队列中 pop 出单个 Actor 消息队列;从 Actor 消息队列中按照规则 pop 出一定

数量的消息进行执行;若 Actor 消息队列中仍有消息继续放入全局队列队尾;若 Actor 消息队列中

没有消息则不放入全局队列中;全局队列只存活跃的 Actor 消息队列;

工作线程权重

工作线程数量是按照 cpu 核心数来设置的;工作线程按照下面工作线程权重图来设置每个工作线

程的权重;

cpp 复制代码
//工作线程权重图  32个核心
static int weight[] = { 
		-1, -1, -1, -1, 0, 0, 0, 0,
		1, 1, 1, 1, 1, 1, 1, 1, 
		2, 2, 2, 2, 2, 2, 2, 2, 
		3, 3, 3, 3, 3, 3, 3, 3, };

工作线程执行规则

从上面逻辑可以看出,当工作线程的权重为 -1 时,该工作线程每次只 pop 一条消息;当工作线

程的权重为 0 时,该工作线程每次消费完所有的消息;当工作线程的权重为 1 时,每次消费消息

队列中 的消息;当工作线程的权重为 2 时,每次消费消息队列中 的消息;以此类推;通过

这种方式,完成消息队列梯度消费,从而不至于让某些队列过长;这种消息调度的方式不是最优的

调度方式(相较于 go 语言),云风也在尝试修改更优的方式来调度;但是目前从多年线上实践情

况来看,skynet 运行良好;

小结

这一篇主要写了skynet的编译,运行;此外,还有Actor相关的一些,包括Actor模型,Actor调度相关的。算是个入门篇吧,对于skynet,早就听说过云风大神,最初学习lua也是看他写的一些教程。这次学习skynet,挺好的。发现了很多以前没有注意到的内容,有兴趣,可以一起学习学习。OK,结束了。

相关推荐
不可求~4 分钟前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
刚入门的大一新生10 分钟前
Linux-Linux的进程状态
linux·运维·服务器
AI备忘录16 分钟前
(十一)DHCP 配置命令五厂商对照:华为 华三 锐捷 迈普 思科
服务器·网络·网络协议·网络安全·华为
随便做点啥24 分钟前
32卡×4090 24GB,Qwen3.8-27B-FP8 集群部署报告
服务器·经验分享·docker·vllm
Brilliantwxx33 分钟前
313131
服务器
暴力求解10 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip
别动我齐刘海11 小时前
机器人运动控制学习2——基础进阶
c++·人工智能·神经网络·学习·目标检测·机器学习·机器人
傻啦嘿哟11 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅12 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
闻道且行之13 小时前
图片处理助手|泊松融合原理 + C++ 工程实现,seamlessClone 三模式一次讲透
数据库·c++·人工智能·opencv