2011-02-19 100 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