浅谈chuck-lua中的多线程

 更新时间:2015年07月08日 11:34:57   投稿:hebedich  
Lua对多线程支持初步体验是本文要介绍的内容,主要是来了解LUA中多线程的使用,,经过反复的实验得到的结果是,lua不支持多线程,如何让它支持?来看本文内容。

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

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()

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

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

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

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

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

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

相关文章

  • Lua中的数学库总结

    Lua中的数学库总结

    这篇文章主要介绍了Lua中的数学库总结,本文罗列了Lua5.1中数学库的所有函数,需要的朋友可以参考下
    2014-11-11
  • Lua中的loadfile、dofile、require详解

    Lua中的loadfile、dofile、require详解

    这篇文章主要介绍了Lua中的loadfile、dofile、require详解,本文分别用实例讲解它的用法和特点等内容,需要的朋友可以参考下
    2014-09-09
  • Lua性能优化技巧(二):基本事实

    Lua性能优化技巧(二):基本事实

    这篇文章主要介绍了Lua性能优化技巧(二):基本事实,本文讲解了一些编译器和寄存器的一些知识,需要的朋友可以参考下
    2015-04-04
  • Lua元表与元方法实例讲解

    Lua元表与元方法实例讲解

    这篇文章主要介绍了Lua元表与元方法实例讲解,本文讲解了算术类、关系类元方法、table访问的元方法等内容,需要的朋友可以参考下
    2014-09-09
  • 举例简介Lua中函数的基本用法

    举例简介Lua中函数的基本用法

    这篇文章主要介绍了举例简介Lua中函数的基本用法,--两个横线开始单行的注释,--[[加上两个[和]表示多行的注释--]],需要的朋友可以参考下
    2015-07-07
  • Lua编程示例(八):生产者-消费者问题

    Lua编程示例(八):生产者-消费者问题

    这篇文章主要介绍了Lua编程示例(八):生产者-消费者问题,本文直接给出实例代码,需要的朋友可以参考下
    2015-07-07
  • Lua教程(四):在Lua中调用C语言、C++的函数

    Lua教程(四):在Lua中调用C语言、C++的函数

    这篇文章主要介绍了Lua教程(四):在Lua中调用C语言、C++的函数,本文给出了多个示例讲解如何在Lua中调用C/C++写的函数,需要的朋友可以参考下
    2014-09-09
  • Openresty服务器使用lua脚本写的Hello World简单实例

    Openresty服务器使用lua脚本写的Hello World简单实例

    这篇文章主要介绍了Openresty服务器使用lua脚本写的Hello World简单实例,OpenResty (也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项,需要的朋友可以参考下
    2015-04-04
  • Golang使用ChatGPT生成单元测试实践

    Golang使用ChatGPT生成单元测试实践

    这篇文章主要为大家介绍了Golang使用ChatGPT生成单元测试实践详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 在Lua中使用模块的基础教程

    在Lua中使用模块的基础教程

    这篇文章主要介绍了在Lua中模块的基本使用方法,是Lua入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05

最新评论