淺談chuck-lua中的多線(xiàn)程
chuck-lua支持actor模式的線(xiàn)程模型.可以通過(guò)cthread.new創(chuàng)建線(xiàn)程,然后通過(guò)cthread.sendmail向線(xiàn)程發(fā)送消息.
與skynet這種框架不同,chuck-lua并不提供多線(xiàn)程的任務(wù)/消息調(diào)度功能,每個(gè)線(xiàn)程維護(hù)了一個(gè)簡(jiǎn)單的線(xiàn)程郵箱,用于緩存其它線(xiàn)程發(fā)過(guò)來(lái)的消息.
下面看一個(gè)簡(jiǎn)單的多線(xiàn)程服務(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è)示例很簡(jiǎn)單,主線(xiàn)程啟動(dòng)監(jiān)聽(tīng),創(chuàng)建一個(gè)線(xiàn)程,當(dāng)接收到連接時(shí)就將fd發(fā)送給worker線(xiàn)程.
在這里需要簡(jiǎn)單介紹一下chuck-lua線(xiàn)程相關(guān)的一些細(xì)節(jié).
因?yàn)楦骶€(xiàn)程跑在獨(dú)立的虛擬機(jī)上,因此無(wú)法直接通過(guò)消息的方式將一個(gè)虛擬機(jī)中的對(duì)象發(fā)送到另一個(gè)線(xiàn)程中.目前sendmail將作為消息傳遞給它的lua table序列化為一種適合傳輸?shù)膶?duì)象,目標(biāo)線(xiàn)程接收這個(gè)對(duì)象之后再重新轉(zhuǎn)化成本線(xiàn)程虛擬機(jī)中的lua table.目前消息支持lua中的所有基本類(lèi)型,但為了安全考慮,不支持直接傳遞userdata類(lèi)型.
用cthread.sendmail向目標(biāo)線(xiàn)程發(fā)送消息時(shí),如果到達(dá)目標(biāo)郵箱的緩沖上線(xiàn)將會(huì)阻塞.所有期望處理郵件消息的線(xiàn)程都必須調(diào)用cthread.process_mail設(shè)定消息回調(diào)函數(shù).如果不設(shè)定,將可能導(dǎo)致消息發(fā)送線(xiàn)程永久阻塞.
線(xiàn)程使用join模式創(chuàng)建,創(chuàng)建者可以通過(guò)cthread.join等待線(xiàn)程的結(jié)束.
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Lua中的loadfile、dofile、require詳解
這篇文章主要介紹了Lua中的loadfile、dofile、require詳解,本文分別用實(shí)例講解它的用法和特點(diǎn)等內(nèi)容,需要的朋友可以參考下2014-09-09舉例簡(jiǎn)介L(zhǎng)ua中函數(shù)的基本用法
這篇文章主要介紹了舉例簡(jiǎn)介L(zhǎng)ua中函數(shù)的基本用法,--兩個(gè)橫線(xiàn)開(kāi)始單行的注釋,--[[加上兩個(gè)[和]表示多行的注釋--]],需要的朋友可以參考下2015-07-07Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題
這篇文章主要介紹了Lua編程示例(八):生產(chǎn)者-消費(fèi)者問(wèn)題,本文直接給出實(shí)例代碼,需要的朋友可以參考下2015-07-07Lua教程(四):在Lua中調(diào)用C語(yǔ)言、C++的函數(shù)
這篇文章主要介紹了Lua教程(四):在Lua中調(diào)用C語(yǔ)言、C++的函數(shù),本文給出了多個(gè)示例講解如何在Lua中調(diào)用C/C++寫(xiě)的函數(shù),需要的朋友可以參考下2014-09-09Openresty服務(wù)器使用lua腳本寫(xiě)的Hello World簡(jiǎn)單實(shí)例
這篇文章主要介紹了Openresty服務(wù)器使用lua腳本寫(xiě)的Hello World簡(jiǎn)單實(shí)例,OpenResty (也稱(chēng)為 ngx_openresty)是一個(gè)全功能的 Web 應(yīng)用服務(wù)器。它打包了標(biāo)準(zhǔn)的 Nginx 核心,很多的常用的第三方模塊,以及它們的大多數(shù)依賴(lài)項(xiàng),需要的朋友可以參考下2015-04-04Golang使用ChatGPT生成單元測(cè)試實(shí)踐
這篇文章主要為大家介紹了Golang使用ChatGPT生成單元測(cè)試實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03