skynet 入门篇

文章目录

  • 概述
    • 1.实现了actor模型
    • 2.实现了服务器的基础组件
  • 环境准备
    • centos
    • ubuntu
    • mac
    • 编译安装
  • Actor
    • Actor模型
      • 定义
      • 组成
    • Actor调度
      • 工作线程流程
      • 工作线程权重
      • 工作线程执行规则
  • 小结

概述

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

轻量级有以下几个方面:

1.实现了actor模型

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

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

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

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

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

环境准备

centos

yum install -y git gcc readline-devel autoconf

ubuntu

apt-get install git build-essential readline-dev autoconf
# 或者
apt-get install git build-essential libreadline-dev autoconf

mac

brew install git gcc readline autoconf

编译安装

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 核心数来设置的;工作线程按照下面工作线程权重图来设置每个工作线
程的权重;

//工作线程权重图  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,结束了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51547.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言百分号打印器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好&#xff0c;我叫这是我58。今天&#xff0c;我们来看一下我用C语言编译的百分号打印器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <…

Redis数据结构之跳跃表(SkipList)

Redis是一个开源的、使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。Redis凭借其高性能、高可用性、丰富的数据结构以及简洁的API而备受青睐。其中&#xff0c;跳跃表&#xff08;SkipList&#xff09;作为Red…

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…

SQL Server数据库管理(五)从权限管理到数据恢复的全面指南

文章目录 SQL Server数据库管理&#xff1a;从权限管理到数据恢复的全面指南引言第一章&#xff1a;权限管理1.1 SQL Server的安全机制1.2 身份验证模式1.3 登录权限设置1.3.1 创建登录账户1.3.2 服务器级别权限 1.4 数据库级别权限1.5 对象级别权限1.6 实验&#xff1a;权限设…

CANoe在使用时碰到的一些很少见的Bug

CANoe作为一款成熟且稳定的总线仿真与测试工具&#xff0c;深受汽车工程师们的喜爱。CANoe虽然稳定&#xff0c;但作为一个软件来说&#xff0c;在使用中总会出现一些或大或小的Bug。最近全球范围内的大规模蓝屏事件&#xff0c;是由某个安全软件引起的。而很多CANoe使用者最近…

Java spring security 自定义登录逻辑实现

介绍 在使用框架自带的Security的登录认证时&#xff0c;默认只能使用用户名去查询&#xff0c;如果有业务需要其他字段也需要进行查询&#xff0c;只能采用根据用户名去找到对应的数据。 自定义鉴权接口CustomUsernamePasswordAuthenticationToken /*** author wuzhenyong* C…

【中项】系统集成项目管理工程师-第7章 软硬件系统集成-7.2基础设施集成

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

【React】详解classnames工具:优化类名控制的全面指南

文章目录 一、classnames的基本用法1. 什么是classnames&#xff1f;2. 安装classnames3. 导入classnames4. classnames的基本示例 二、classnames的高级用法1. 动态类名2. 传递数组3. 结合字符串和对象4. 结合数组和对象 三、实际应用案例1. 根据状态切换类名2. 条件渲染和类名…

Kafka消息队列

目录 什么是消息队列 高可用性 高扩展性 高可用性 持久化和过期策略 consumer group 分组消费 ZooKeeper 什么是消息队列 普通版消息队列 说白了就是一个队列,生产者生产多少,放在消息队列中存储,而消费者想要多少拿多少,按序列号消费 缓存信息 生产者与消费者解耦…

VulnHub靶机入门篇--Kioptrix4

1.环境配置 下载地址&#xff1a; https://download.vulnhub.com/kioptrix/Kioptrix4_vmware.rar 下载完解压之后是一个vdmk文件&#xff0c;我们需要先创建一个新的虚拟机&#xff0c;将vdmk文件导入就行了 先移除原先硬盘&#xff0c;然后再进行添加&#xff0c;网络连接为…

EV代码签名证书具体申请流程

EV&#xff08;扩展验证&#xff09;代码签名证书是一种用于对代码进行数字签名的安全证书&#xff0c;它可以帮助用户验证软件发布者的身份&#xff0c;并确保软件未被篡改。对于Windows硬件开发者来说&#xff0c;这种证书尤其重要&#xff0c;因为它可以用来注册Windows硬件…

【Golang 面试 - 基础题】每日 5 题(八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

【DP】01背包

算法-01背包 前置知识 DP 思路 01背包一般分为两种&#xff0c;不妨叫做价值01背包和判断01背包。 价值01背包 01背包问题是这样的一类问题&#xff1a;给定一个背包的容量 m m m 和 n n n 个物品&#xff0c;每个物品有重量 w w w 和价值 v v v&#xff0c;求不超过背…

unity 导出 资源 -- 的 Player Settings... Inspector ----配置文件

--------------------------- unity 导出 资源 -- 的 Player Settings... Inspector ----配置文件名称--------OK 配置 文件位置&#xff1a;E:\BL\client\ProjectSettings\ProjectSettings.asset 具体操作&#xff1a; 复制一个备份配置 ------.unity--File--Build-Setting…

六、2 写PWM代码(函数介绍、呼吸灯代码)

目录 一、1、步骤 2、函数介绍 3、外设引脚和GPIO引脚的复用关系&#xff08;引脚定义表&#xff09; 二、1、呼吸灯 步骤 &#xff08;1&#xff09;初始化通道 1&#xff09;输出比较模式 2&#xff09;输出比较极性 &#xff08;2&#xff09;配置GPIO &#xff08…

Zabbix 部署 - docker

考虑方便移植&#xff0c;多环境部署&#xff0c;整体采用 docker-compose 方式部署 docker-compose 总共4个服务&#xff0c;数据库 后台服务 前端服务 Agent version: 3.7 services:zabbix-mysql:container_name: zabbix-mysqlimage: mysql:5.7.40restart: alwaysenviro…

肆[4],VisionMaster全局触发测试说明

1&#xff0c;环境 VisionMaster4.3 2&#xff0c;实现功能 2.1&#xff0c;全局触发进行流程控制执行。 2.2&#xff0c;取像完成&#xff0c;立即运动到下一个位置&#xff0c;同步进行图片处理。 2.3&#xff0c;发送结果的同时&#xff0c;还需要显示图像处理的痕迹。 …

如何运行别人的vue项目

文章目录 如何运行别人的vue项目一、删除现有的node_modules二、npm换源三、清理缓存四、进行依赖安装五、运行服务器 如何运行别人的vue项目 一、删除现有的node_modules 二、npm换源 换成淘宝的镜像源 查看当前镜像源 npm config get registry更换淘宝镜像源 npm confi…

如何在VB中处理异常和错误

在Visual Basic (VB) 中&#xff0c;处理异常和错误是确保程序稳定性和健壮性的重要部分。VB提供了结构化的异常处理机制&#xff0c;允许开发者在代码执行过程中预测并响应可能出现的错误情况。以下是VB中处理异常和错误的基本方法&#xff1a; 1. 使用 Try...Catch...Finall…

H616设计时候存在的问题

1.存在大量孤铜的问题&#xff1a; 这种情况是绝对不允许的&#xff0c;但是GBA焊盘打大量的过孔会出现很多这样的孤铜&#xff1a; 解决办法&#xff1a; 像这种出现大量重复焊盘的&#xff0c;用导线连接起来&#xff0c;之后铺铜形成铜皮&#xff0c;再在这个小铜皮上面打…