skynet学习笔记02— skynet介绍、skynet基础API与环境变量

01、Skynet与Actor模型

在系统Skynet之前,先了解一下Skynet与Actor模型,下列是风云大佬的介绍以及一个大佬的博客

  • https://github.com/cloudwu/skynet/wiki/GettingStarted
  • https://blog.csdn.net/qq769651718/article/details/79432793

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。

原文链接:https://blog.csdn.net/qq769651718/article/details/79432793

Skynet介绍

风云大佬的介绍:https://github.com/cloudwu/skynet/wiki/GettingStarted

Skynet 是一个基于C跟lua的开源服务端并发框架,用c + lua基于Actor模型实现。
整个skynet框架要解决的核心问题是:把一个消息(数据包)从一个服务(Actor)发送给另一个服务(Actor),并接收其返回。也就是在同一进程内(作者也强调并非只限于同一进程,因为可能会有集群间的通讯)的一个服务通过类似rpc之类的调用同一进程内的另外一个服务,并接收处理结果。而skynet就是处理这些服务间发送数据包的规则和正确性。

02、Skynet基础API

  • start(func): 用 func函数初始化服务,并将消息处理函数注册到 C 层,让该服务可以工作。
  • init(func):若服务尚未初始化完成,则注册一个函数等服务初始化阶段再执行;若服务已经初始化完成,则立刻运行该函数。
  • setenv(key,value): 向当前进程内注册表添加一项(不可以重置已有配置项)。
  • skynet.getenv(key) :conf配置信息已经写入到注册表中,通过该函数获取注册表的变量值
  • skynet.exit(): 结束当前服务
  • skynet.error(str):打印函数

全部API列表:https://github.com/cloudwu/skynet/wiki/APIList

03、Demo

配置

project = "../project/"

thread = 8
cpath = "./cservice/?.so"
bootstrap = "snlua bootstrap"
start = "01baskAPI"
-- 可以是 1-255 间的任意整数。一个 skynet 网络最多支持 255 个节点。每个节点有必须有一个唯一的编号。
-- 如果 harbor 为 0 ,skynet 工作在单节点模式下。此时 master 和 address 以及 standalone 都不必设置。
harbor = 0 
lualoader = "./lualib/loader.lua"
luaservice = "./service/?.lua;"..project.."?.lua;"
lua_path =  "./lualib/?.lua;" .. "./lualib/?/init.lua;"
lua_cpath = "./luaclib/?.so"

-- 自定义的变量
myname = "mhzzj"
myage = 9999

代码

local skynet = require "skynet"

skynet.init(function ()
    local name = skynet.getenv("myname")    
    local age = skynet.getenv("myage")   
    skynet.error("01baskAPI [init] name",name,"age",age,"newKey",skynet.getenv("newKey")) 
    skynet.setenv("newKey","newValue");
    skynet.error("01baskAPI [init] name",name,"age",age,"newKey",skynet.getenv("newKey")) 
    -- skynet.setenv("newKey","newValue2"); 对已经存在的key赋值会导致报错
    -- skynet.setenv("myname","myname");
end)


skynet.start(function()
    local name = skynet.getenv("myname")    
    local age = skynet.getenv("myage")  
	skynet.error("01baskAPI [start main] name ",name,"age",age,"newKey",skynet.getenv("newKey"))
	skynet.exit()
end)

运行结果

在这里插入图片描述

04、相关代码

https://gitee.com/mhz-zzj/skynet-study
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值