【问题标题】:How can a LuaSocket server handle several requests simultaneously?LuaSocket 服务器如何同时处理多个请求?
【发布时间】:2011-02-19 17:50:55
【问题描述】:
问题是我的 Lua 服务器无法同时接受多个请求。
我试图让每个客户端消息都在其 on 协程中处理,但这似乎失败了。
while true do
local client = server:accept()
coroutine.resume(coroutine.create( function()
GiveMessage( client )
end ) )
end
此代码实际上似乎不会同时接受多个客户端消息。这种方法有什么问题?感谢您的帮助。
【问题讨论】:
标签:
networking
lua
luasocket
【解决方案1】:
您将无法仅使用协程创建真正的同时处理——协程用于合作多任务处理。同一时间只执行一个协程。
您编写的代码与直接在循环中调用GiveMessage() 没有区别。您需要编写一个协程调度程序,并找到一个合理的理由放弃 GiveMessage() 以使该方法起作用。
至少有三种解决方案,具体取决于您的任务:
为您的服务器生成多个分支,在每个分支中处理协程中的操作。使用Copas 或lua-ev 或国产调度程序控制协程,这没有错。我推荐这种方式。
使用 Lua 状态而不是协程,保留状态池、工作操作系统线程池和任务队列。使用空闲的工作线程在空闲的 Lua 状态下执行每个任务。需要一些低级编码,而且比较麻烦。
寻找现有的更专业的解决方案 - 有几个,但我需要更好地了解您正在编写什么样的服务器。
无论您选择什么,请避免同时使用来自多个线程的单个 Lua 状态。 (通过适量的编码,这是可能的,但这是个坏主意。)
【解决方案2】:
AFAIK 协程不能很好地与开箱即用的 luaSocket 配合使用。但是有Copas可以使用。