主頁 > 知識(shí)庫 > 淺談chuck-lua中的多線程

淺談chuck-lua中的多線程

熱門標(biāo)簽:杞縣地圖標(biāo)注app 衡水外呼線路解決 外呼系統(tǒng)一天耗費(fèi)多少流量 艾比利外呼系統(tǒng) 昆明電話外呼系統(tǒng)好么 陜西便宜電銷機(jī)器人軟件 電話機(jī)器人每天搜索多少次 ??谥悄苷Z音電銷機(jī)器人好用嗎 免費(fèi)門店地圖標(biāo)注注冊入駐

chuck-lua支持actor模式的線程模型.可以通過cthread.new創(chuàng)建線程,然后通過cthread.sendmail向線程發(fā)送消息.

與skynet這種框架不同,chuck-lua并不提供多線程的任務(wù)/消息調(diào)度功能,每個(gè)線程維護(hù)了一個(gè)簡單的線程郵箱,用于緩存其它線程發(fā)過來的消息.

下面看一個(gè)簡單的多線程服務(wù)器示例:

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

--設(shè)置郵件處理函數(shù)
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()

這個(gè)示例很簡單,主線程啟動(dòng)監(jiān)聽,創(chuàng)建一個(gè)線程,當(dāng)接收到連接時(shí)就將fd發(fā)送給worker線程.

在這里需要簡單介紹一下chuck-lua線程相關(guān)的一些細(xì)節(jié).

因?yàn)楦骶€程跑在獨(dú)立的虛擬機(jī)上,因此無法直接通過消息的方式將一個(gè)虛擬機(jī)中的對象發(fā)送到另一個(gè)線程中.目前sendmail將作為消息傳遞給它的lua table序列化為一種適合傳輸?shù)膶ο?目標(biāo)線程接收這個(gè)對象之后再重新轉(zhuǎn)化成本線程虛擬機(jī)中的lua table.目前消息支持lua中的所有基本類型,但為了安全考慮,不支持直接傳遞userdata類型.

用cthread.sendmail向目標(biāo)線程發(fā)送消息時(shí),如果到達(dá)目標(biāo)郵箱的緩沖上線將會(huì)阻塞.所有期望處理郵件消息的線程都必須調(diào)用cthread.process_mail設(shè)定消息回調(diào)函數(shù).如果不設(shè)定,將可能導(dǎo)致消息發(fā)送線程永久阻塞.

線程使用join模式創(chuàng)建,創(chuàng)建者可以通過cthread.join等待線程的結(jié)束.

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

標(biāo)簽:宿遷 泰安 南京 昌都 臨滄 ???/a> 西寧 營口

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談chuck-lua中的多線程》,本文關(guān)鍵詞  淺談,chuck-lua,中的,多,線程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談chuck-lua中的多線程》相關(guān)的同類信息!
  • 本頁收集關(guān)于淺談chuck-lua中的多線程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章