• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >Lua > 浅谈chuck-lua中的多线程

浅谈chuck-lua中的多线程

作者:hebedich 字体:[增加 减小] 来源:互联网

hebedich 通过本文主要向大家介绍了浅谈一题多解,浅谈养多肉植物的好处,浅谈对多动幼儿的教育,浅谈福气多玉石床感想,浅谈中小企业融资问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

chuck-lua支持actor模式的线程模型.可以通过cthread.new创建线程,然后通过cthread.sendmail向线程发送消息.

与skynet这种框架不同,chuck-lua并不提供多线程的任务/消息调度功能,每个线程维护了一个简单的线程邮箱,用于缓存其它线程发过来的消息.

下面看一个简单的多线程服务器示例:

mtserver.lua

local chuck = require("chuck")
local engine = require("distri.engine")
local socket_helper = chuck.socket_helper
local Distri = require("distri.distri")
local cthread = chuck.cthread

local worker 

function on_new_client(fd)
  cthread.sendmail(worker,{fd})
end

local fd = socket_helper.socket(socket_helper.AF_INET,
                 socket_helper.SOCK_STREAM,
                 socket_helper.IPPROTO_TCP)
socket_helper.addr_reuse(fd,1)

local ip = "127.0.0.1"
local port = 8010

if 0 == socket_helper.listen(fd,ip,port) then
  print("server start",ip,port)
  local server = chuck.acceptor(fd)
  server:Add2Engine(engine,on_new_client)
  Distri.Signal(chuck.signal.SIGINT,Distri.Stop) 
  worker = cthread.new("distri/test/worker.lua")
  Distri.Run()
end

</div>

worker.lua

local chuck = require("chuck")
local socket = require("distri.socket")
local engine = require("distri.engine")
local clone  = chuck.packet.clone
local cthread = chuck.cthread
local Distri = require("distri.distri")

--设置邮件处理函数
cthread.process_mail(engine,function (sender,mail)
  local fd = table.unpack(mail)
  local s = socket.stream.New(fd)
  if s:Ok(4096,socket.stream.decoder.rawpacket(),function (_,msg,errno)
    if msg then
      s:Send(clone(msg))
    else
      s:Close(errno)
      s = nil
    end
  end) then
    s:SetRecvTimeout(5000)
  else
    s:Close()
  end 
end)

Distri.Run()

</div>

这个示例很简单,主线程启动监听,创建一个线程,当接收到连接时就将fd发送给worker线程.

在这里需要简单介绍一下chuck-lua线程相关的一些细节.

因为各线程跑在独立的虚拟机上,因此无法直接通过消息的方式将一个虚拟机中的对象发送到另一个线程中.目前sendmail将作为消息传递给它的lua table序列化为一种适合传输的对象,目标线程接收这个对象之后再重新转化成本线程虚拟机中的lua table.目前消息支持lua中的所有基本类型,但为了安全考虑,不支持直接传递userdata类型.

用cthread.sendmail向目标线程发送消息时,如果到达目标邮箱的缓冲上线将会阻塞.所有期望处理邮件消息的线程都必须调用cthread.process_mail设定消息回调函数.如果不设定,将可能导致消息发送线程永久阻塞.

线程使用join模式创建,创建者可以通过cthread.join等待线程的结束.

以上所述就是本文的全部内容了,希望大家能够喜欢。

</div>

您可能想查找下面的文章:

  • 浅谈chuck-lua中的多线程

相关文章

  • Lua判断变量是否为数字、字符串是否可以转换为数字等
  • 实现Lua中数据类型的源码分享
  • Lua教程(十六):系统库(os库)
  • Lua中for循环语句的使用教程
  • Lua编程中的一些基本语法整理
  • Lua loadstring函数用法实例
  • Lua编程示例(五): C语言对Lua表的读取和添加
  • Lua之协同程序coroutine代码实例
  • Lua中if语句嵌套的使用教程
  • Lua所有内置函数罗列

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • Lua学习笔记之类型与值
    • Lua脚本自动生成APK包
    • Lua中的函数写法简明示例
    • Lua中调用C++函数示例
    • Lua协同程序(COROUTINE)运行步骤分解
    • Lua中的变量类型与语句学习总结
    • Lua中string.lower()使用指南
    • Lua中访问table里函数的方法示例
    • C++遍历Lua table的方法实例
    • Lua编程示例(四):Lua标准库之表库、字符串库、系统库

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有