1

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

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

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

4

2 回答 2

4

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

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

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

  • 生成服务器的多个分支,在每个分支中处理协程中的操作。使用Copas或使用lua-ev或使用本地调度程序控制协程,这没有错。我推荐这种方式。

  • 使用 Lua 状态而不是协程,保留状态池、工作操作系统线程池和任务队列。使用空闲的工作线程在空闲的 Lua 状态下执行每个任务。需要一些低级编码并且比较混乱。

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

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

于 2011-02-19T09:50:55.823 回答
-1

AFAIK 协程不能很好地与开箱即用的 luaSocket 配合使用。但是你可以使用Copas 。

于 2011-02-19T09:39:59.833 回答