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

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

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

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

原文链接 https://stackoverflow.com/questions/5047951

点赞
stackoverflow用户513763
stackoverflow用户513763

AFAIK(据我所知),协程默认情况下与 luaSocket 不兼容。但是可以使用 Copas 解决这个问题。

2011-02-19 09:39:59
stackoverflow用户6236
stackoverflow用户6236

你不能单纯地使用协程来创建真正的同时处理——协程只适用于协作式的多任务处理。同一时间只能执行一个协程。

你编写的代码与直接在循环中调用 GiveMessage() 并无不同。为了使这种方法可行,你需要编写协程调度器,并找到一个合理的原因来暂停 GiveMessage()

根据任务的具体情况,至少有三种解决方案:

  • 在服务器上生成多个分支,在每个分支中使用协程处理操作。可以用Copaslua-ev或自己编写调度器来控制协程,这种方法值得推荐。

  • 使用 Lua 状态代替协程,保持状态池、工作线程池和任务队列。在一个空闲的 Lua 状态中,使用一个空闲的工作线程来执行每个任务。需要一些底层编码,比较复杂。

  • 寻找现有的更专门的解决方案——有几种,但为了给予建议,我需要更好地了解你正在编写什么样的服务器。

  • 无论你选择哪种方法,都要避免在多个线程中同时使用单个 Lua 状态。(这是可能的,但是不是一个好主意。)

2011-02-19 09:50:55