2011-02-19 135 views
1

問題是我的Lua服務器無法同時接受多個請求。 我試圖讓每個客戶端消息在協程上處理,但這似乎失敗了。LuaSocket服務器如何同時處理多個請求?

while true do 
local client = server:accept() 
coroutine.resume(coroutine.create(function() 
GiveMessage(client) 
end)) 
end 

此代碼似乎並不實際上同時接受多個客戶端消息。這種方法有什麼問題?感謝您的幫助。

回答

4

您將無法只使用協程創建真正的同時處理 - 協程是合作多任務。同時只執行一個協程。

您編寫的代碼與直接在循環中調用GiveMessage()沒有區別。您需要編寫協同調度程序,並找到合理的理由從GiveMessage()中獲得該方法的工作。

有至少三種解決方案,這取決於你的任務的細節:你的服務器的

  • 菌種幾個叉,在每個叉協同程序處理操作。使用Copaslua-ev或使用本地調度程序控制協程,沒有任何問題。我推薦這種方式。

  • 使用Lua狀態而不是協程,保留一個狀態池,工作操作系統線程池和任務隊列。使用免費的工作線程以免費的Lua狀態執行每個任務。需要一些低級編碼並且更加混亂。

  • 尋找現有的更專業的解決方案 - 有幾個,但建議我需要更好地知道你在寫什麼樣的服務器。

  • 無論您選擇什麼,都要避免同時使用多個線程中的單個Lua狀態。 (有可能,用適量的編碼,但是一個壞主意。)

-1

AFAIK協同程序不能與luaSocket開箱即用。但你可以使用Copas

+0

Copas本身使用協同程序。 – 2011-02-19 09:42:20