LuaSocket服务器如何同时处理多个请求?

时间:2011-02-19 00:23:25

标签: networking lua luasocket

问题是我的Lua服务器无法同时接受多个请求。 我尝试在其协同程序中处理每个客户端消息,但这似乎已失败。

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

此代码似乎实际上不会同时接受多个客户端消息。这种方法有什么问题?谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

您将无法仅使用协同程序创建真正的同时处理 - 协程用于协作多任务处理。只有一个协同程序同时执行。

您编写的代码与直接在循环中调用GiveMessage()没有什么不同。您需要编写一个协程调度程序,并找到一个合理的理由从GiveMessage()获得该工作方法。

至少有三种解决方案,具体取决于您的任务细节:

  • 生成服务器的几个fork,处理每个fork中的coroutines中的操作。使用Copaslua-ev或本地调度程序控制协同程序,没有任何问题。我推荐这种方式。

  • 使用Lua状态而不是协程,保留状态池,工作线程OS线程池和任务队列。使用自由工作线程在自由Lua状态下执行每个任务。需要一些低级编码并且更加混乱。

  • 寻找现有的更专业的解决方案 - 有几个,但建议我需要更好地了解您正在编写什么样的服务器。

  • 无论您选择什么,都要避免同时使用多个线程中的单个Lua状态。 (有可能,通过适当的编码量,但是一个坏主意。)

答案 1 :(得分:-1)

AFAIK协程与开箱即用的luaSocket不搭配。但是你可以使用Copas