skynet 是多线程框架,此外在 skynet 中,每个服务对应一个 lua 虚拟机,一个虚拟机上可以跑多个协程,但同一时刻只能有一个协程,每条消息处理由协程来完成。

在 skynet 中,线程创建方式:

skynet.fork(func,…)

一、测试

main.lua

local skynet = require "skynet"skynet.start(function()function myfork( val )while true doprint('myfork ', val, ' !!!! ')skynet.sleep(200)endendlocal co1 = skynet.fork(myfork, 1)local co2 = skynet.fork(myfork, 2)end)

测试结果:

可以看到两个线程函数交替运行。

二、skynet.fork 原理

skynet.lua

function skynet.fork(func,...)local n = select("#", ...)--获取参数个数local coif n == 0 thenco = co_create(func)elselocal args = { ... }    --table.unpack(table, start, end):返回 table 中 [start, end] 区间的元素,start 默认为1,end 默认为最后一个元素的位置        co = co_create(function() func(table.unpack(args,1,n)) end)--创建一个协程,相当于创建一个lua虚拟机endtinsert(fork_queue, co)--将协程加到fork_queue队列中 return co
end

从协程池中取出一个空闲协程,没有,则创建一个新的协程:

local function co_create(f)local co = tremove(coroutine_pool) --从协程池table末尾取出一个协程--协程池table为空,则创建新协程if co == nil thenco = coroutine_create(function(...)f(...)while true dolocal session = session_coroutine_id[co]if session and session ~= 0 thenlocal source = debug.getinfo(f,"S")skynet.error(string.format("Maybe forgot response session %s from %s : %s:%d",session,skynet.address(session_coroutine_address[co]),source.source, source.linedefined))end-- coroutine exitlocal tag = session_coroutine_tracetag[co]if tag ~= nil thenif tag then c.trace(tag, "end")   endsession_coroutine_tracetag[co] = nilendlocal address = session_coroutine_address[co]if address thensession_coroutine_id[co] = nilsession_coroutine_address[co] = nilend-- recycle co into poolf = nilcoroutine_pool[#coroutine_pool+1] = co--把新协程加入协程池-- recv new main function ff = coroutine_yield "SUSPEND"f(coroutine_yield())endend)else-- pass the main function f to coroutine, and restore running threadlocal running = running_threadcoroutine_resume(co, f)running_thread = runningendreturn co
end

处理fork_queue中的fork协程

function skynet.dispatch_message(...)local succ, err = pcall(raw_dispatch_message,...)--处理fork_queue中的fork协程while true dolocal co = tremove(fork_queue,1)if co == nil thenbreakendlocal fork_succ, fork_err = pcall(suspend,co,coroutine_resume(co))if not fork_succ thenif succ thensucc = falseerr = tostring(fork_err)elseerr = tostring(err) .. "\n" .. tostring(fork_err)endendendassert(succ, tostring(err))
end

skynet:fork相关推荐

  1. Boost:fork守护程序的测试程序

    Boost:fork守护程序的测试程序 实现功能 C++实现代码 实现功能 fork守护程序的测试程序 C++实现代码 #include <boost/asio/io_context.hpp&g ...

  2. Boost:fork联接的测试程序

    Boost:fork联接的测试程序 实现功能 C++实现代码 实现功能 boost::asio模块,fork联接的测试程序 C++实现代码 #include <boost/asio/execut ...

  3. JAVA并行框架:Fork/Join

    转载自 https://www.cnblogs.com/dongguacai/p/6021859.html JAVA并行框架:Fork/Join 一.背景 虽然目前处理器核心数已经发展到很大数目,但是 ...

  4. Java 7:Fork / Join框架示例

    Java 7中的Fork / Join Framework专为可分解为较小任务的工作而设计,并将这些任务的结果组合起来以产生最终结果. 通常,使用Fork / Join Framework的类遵循以下 ...

  5. Java并发编程(07):Fork/Join框架机制详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.Fork/Join框架 Java提供Fork/Join框架用于并行执行任务,核心的思想就是将一个大任务切分成多个小任务,然后汇总每个小任务 ...

  6. Git协助方式:Fork项目开发新功能并使用Pull-Request把新特性推送给原项目

    Git协助方式:Fork项目开发新功能并使用Pull-Request把新特性推送给原项目 Pull Request 是开发者使用 GitHub 进行协作的利器.这个功能为用户提供了友好的页面,让提议的 ...

  7. Java7并发编程指南——第五章:Fork Join框架

    Java7并发编程指南--第五章:Fork Join框架 @(并发和IO流) Java7并发编程指南第五章Fork Join框架 思维导图 项目代码 思维导图 项目代码 GitHub:Java7Con ...

  8. CSAPP作业:Fork函数的学习感悟

    在CSAPP课程学习中,教材的第八章:异常控制流中出现了一个名为Fork的函数,在书中提到它可以将一个进程复制为几乎相同却不完全相同的两个进程,被用于系统调用错误处理中,这使我对它产生了浓厚的兴趣. ...

  9. 使用 Git 的一点点疑惑:fork 跟 branch 的关系

    一.引言 最近在工作中接触到了一种 "别样" 的代码管理方式: 一个项目新建出来,先由项目负责人从主干的分支上 fork 出来一个仓库,然后各项目成员向这个 fork 出来的仓库中 ...

最新文章

  1. 看,这就是你心心念的研究生生活
  2. 大整数减法c语言_C语言学习笔记(一)
  3. Android4.4.2KK竖屏强制更改为横屏的初步简略方案
  4. 《构建高可用Linux服务器》卓越网和互动网上架了
  5. 机器学习:从入门到晋级
  6. android inputmethodmanager 不自动弹出,Android中软键盘InputMethodManager的弹出和隐藏,以及显示和隐藏的监听...
  7. 国际市场营销知识框架图_货币银行学知识怎么学?知识点很杂乱?已经为你整理好了!...
  8. JFinal源码解析--从请求到处理返回流程
  9. Linux下如何编写和使用自定义的Shell函数和函数库
  10. linux mate桌面主题下载_5个适用于Linux的最佳图标主题
  11. 想给视频去色并加马赛克就用它
  12. 学计算机跨考航天航空,北京航空航天大学计算机考研辅导班:跨考考研经验
  13. Python实现m3u8下载mp4视频原理及源码
  14. SFDC Developer
  15. 天翼云、移动云ubuntu服务器分区和磁盘挂载步骤
  16. 基于lamp搭建Discuz论坛
  17. JQurey动画队列
  18. 数据压缩三 AVI和WAV格式分析
  19. ARChon 分析之五 : chrome-app的开发方法
  20. javaScript(2021最全复习总结+面试)

热门文章

  1. X-Cash空投领取教程
  2. 使用jquery的bind来检测textarea,input等的文本变化
  3. 思维导图与概念图的区别是什么?
  4. PaddleHub人体骨骼关键点检测(2.0环境)
  5. 餐厅设置套餐 html,餐厅如何设计爆款套餐?掌握这5个原则就够了
  6. JSAPI支付——H5网页端调起支付接口
  7. 当今的BIOS(UEFI)
  8. Maven打包Resource资源文件损坏解决
  9. LINK : fatal error LNK1168: cannot open Debug/xxx.exe for writing
  10. 马云最新撰文:公司假口号越多 员工士气越低落