【问题标题】: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() 以使该方法起作用。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • Copas 本身使用协程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多