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.rhkb.cn/news/385565.html

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

相关文章

react18+

主要是围绕函数式组件讲,18主要用就是函数式组件,学习前先熟悉下原生js的基本使用,主要是事件 1、UI操作 1.1、书写jsx标签语言 基本写法和原生如同一则,只是放在一个方法里面返回而已,我们称这样的写法为函数式组件…

ChatTTS(文本转语音) 一键本地安装爆火语音模型

想不想让你喜欢的文章,有着一个动听的配音,没错,他就可以实现。 ChatTTS 是一款专为对话场景设计的文本转语音模型,例如 LLM 助手对话任务。它支持英语和中文两种语言。 当下爆火模型,在Git收获23.5k的Star&#xff…

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点,这个知识点也很抽象,需要我们很好的掌握,而且快速排序的代码也是非常重要,需要我们懂了还不行,必须要手撕代码,学的透彻。 在研究快速排序之前,我们首先…

PyTorch 2.0 GPU Nvidia运行库的安装

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客 假设读者电脑带有NVIDIA 20 以上系列的显卡。 我们以CUDA 11.7cuDNN 8.2.0(其他更高版本的组合,读者可以执行查阅PyTorch官网获得)为例,讲解PyTorch 2.0 GPU版本的安…

【Linux】多线程4——线程同步/条件变量

1.Linux线程同步 1.1.同步概念与线程饥饿问题 先来理解同步的概念 什么是线程同步 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地…

云服务器Ubuntu18.04进行Nginx配置

云服务器镜像版本信息:Ubuntu 18.04 server 64bit,本文记录了在改版本镜像上安装Nginx,并介绍了Nginx配置文件目录,便于后面再次有需求时进行复习。 文章目录 Nginx的安装Nginx配置文件分析 Nginx的安装 1.执行下面命令进行安装…

linux 部署flask项目

linux python环境安装: https://blog.csdn.net/weixin_41934979/article/details/140528410 1.创建虚拟环境 python3.12 -m venv .venv 2.激活环境 . .venv/bin/activate 3.安装依赖包(pip3.12 install -r requirements.txt) pip3.12 install -r requirements.txt 4.测试启…

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中,git的使用是必不可少的。Git 是一款分布式版本控制系统,用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式,将本地项目上传到远程仓库,虽然现在的IDE中基本都配置了g…

React类组件生命周期与this关键字

类组件生命周期 参考链接 一图胜千言(不常用的生命周期函数已隐藏) 代码: //CC1.js import { Component } from "react";export default class CC1 extends Component {constructor(props) {super(props);console.log("con…

人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(高级)课程8-图像分割项目之Mask-RCNN模型的介绍与代码详解。Mask R-CNN模型是一种广泛应用于目标检测和实例分割的任务的深度学习框架。本文将详细介绍Mask R-CNN的原理,包括Box Regression、Classification和Mask …

追问试面试系列:开篇

我们不管做任何事情,都是需要个理由,而不是盲目去做。 为什么写这个专栏? 就像我们被面试八股文时,市面上有很多面试八股文,随便一个八股文都是500,甚至1000面试题。诸多面试题,难道我们需要一…

Node Js开发环境的搭建

前言 通过自动化繁琐的设置和配置工作,帮助开发者快速启动新项目。常见的Node脚手架工具包括Yeoman、Express Generator、Create React App等。 一、什么是脚手架 1、什么是脚手架? 脚手架在软件开发中指的是一种自动化工具或脚本,用于快速创…

谷粒商城实战笔记-72-商品服务-API-属性分组-获取分类属性分组

文章目录 一,后端接口开发Controller层修改接口接口测试 二,前端开发 这一节的内容是开发获取分类属性分组的接口。 一,后端接口开发 Controller层修改接口 修改AttrGroupController接口。 RequestMapping("/list/{catelogId}")p…

【算法/训练】:动态规划(线性DP)

一、路径类 1. 字母收集 思路: 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数,由于只能往下和往右走,因此走到(i,j)的位置要就是从(i - 1, j)往下走&#…

【Go系列】Go的UI框架Fyne

前言 总有人说Go语言是一门后端编程语言。 Go虽然能够很好地处理后端开发,但是者不代表它没有UI库,不能做GUI,我们一起来看看Go怎么来画UI吧。 正文 Go语言由于其简洁的语法、高效的性能和跨平台的编译能力,非常适合用于开发GUI…

鸿蒙应用框架开发【dlopen加载so库并获取Rawfile资源】 NDK

dlopen加载so库并获取Rawfile资源 介绍 本示例中主要介绍在TaskPool子线程中使用dlopen加载so库,以及如何使用Native Rawfile接口操作Rawfile目录和文件。功能包括文件列表遍历、文件打开、搜索、读取和关闭Rawfile。 效果预览 使用说明 应用界面中展示了Rawfil…

2024最新Uniapp的H5网页版添加谷歌授权验证

现在教程不少,但是自从谷歌升级验证之后,以前的老教程就失效了,现在写一个新教程以备不时之需。 由于众所周知的特殊原因,开发的时候一定注意网络环境,如果没有梯子是无法进行开发的哦~ clientID的申请方式我就不再进…

昇思MindSpore 应用学习-DCGAN生成漫画头像-CSDN

日期 心得 昇思MindSpore 应用学习-DCGAN生成漫画头像(AI代码学习) DCGAN生成漫画头像 在下面的教程中,我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中,使用的动…

数据结构:二叉树(堆)的顺序存储

文章目录 1. 树1.1 树的概念和结构1.2 树的相关术语 2. 二叉树2.1 二叉树的概念和结构2.2 二叉树的特点2.3 特殊的二叉树2.3.1 满二叉树2.3.2 完全二叉树 2.4 二叉树的性质 3. 实现顺序结构二叉树3.1 堆的概念和结构3.2 初始化3.3 销毁3.4 插入数据3.5 向上调整算法3.6 删除数据…

如何查找下载安装安卓APK历史版本?

在安卓设备上,有时候我们可能希望安装某个软件的旧版本,可能是因为新版本不兼容、功能改变不符合需求或是其他原因。 安卓系统并不像iOS那样提供直观的历史版本下载界面。 不过,通过一些第三方市场和网站,我们仍然可以找到并安装…