【问题标题】:How exactly do Lua asynchronous calls in Roblox work?Roblox 中的 Lua 异步调用究竟是如何工作的?
【发布时间】:2018-09-20 17:24:41
【问题描述】:

我来自 Javascript 背景,非常习惯于带有回调的异步调用。还精通 Promise 和 asynch await。我最近开始开发 Roblox 游戏,它的 Lua SDK 提供了一堆不需要回调的 DoSomethingAsync 函数。我在网上查了一些资源,有人说在异步调用后放弃执行控制,直到结果回来,控制稍后返回。这允许开发人员编写代码,就好像事情是同步完成的。有人可以验证这是否真的是真的吗?线程模型是否类似于解释器只有一个线程的 Javascript?

【问题讨论】:

  • 如果你想知道开源究竟是如何工作的,请查看它的源代码...github.com/roblox
  • Roblox 不是开源的。你给我的链接是一堆存储库,除了 Roblox 本身。
  • 很抱歉。我没有密切关注。如果它不是开源的,您只能参考文档或开发人员。其他任何事情都只是猜测工作。 API 参考包含很多关于线程、协程的内容。 StackOverflow 也不适合问这些问题。这就是 Robolox 社区的用途。 devforum.roblox.com/c/development-support

标签: lua roblox


【解决方案1】:

诚然,由于命名,这有点令人困惑。名称中带有异步的 API 调用是在 C++ 端的异步调用,主要针对 Web 服务,它们确实使用 C++ 中的回调函数。但是你没有从 Lua 注册回调,它们的行为就像你正在同步调用一个内部有 wait() 语句的 Lua 函数。这些 API 调用在 wiki 上通常表示为“YieldFunctions”,因为这正是它们所做的,它们产生 Lua 线程并且在调用 C++ 回调函数并将 Web 请求的结果传回 Lua 之前不会返回。

【讨论】:

    【解决方案2】:

    Lua 和 JavaScript 一样,一次只执行一个线程。然而,Lua 有一个名为coroutines 的特性,它允许不同的执行线程交错执行。 (Lua协程有点类似于JavaScript的async函数)

    coroutine.resume(thread) 将执行切换到thread(“现在轮到你了”)。 coroutine.resume 的调用者将在 thread 完成或调用 coroutine.yield() 时重新获得控制权(“我现在完成了,稍后再给我回电”)。

    Roblox 有一个thread scheduler,它决定当当前调度的线程yields 时下一个运行哪个线程。当线程调用wait() 或任何yield 函数时,线程将屈服。

    IO 请求在 C++ 中的单独线程中完成(就像 JavaScript)。当 IO 请求完成时,调度程序将请求 IO 的已产生线程放在要调度的队列的前面(与 Javascript 不同)。


    上面的线程调度程序链接有一个wait() 外观的示例,通过忙等待在纯 Lua 中实现。在 C++ 中,您可以使用真正的睡眠来避免 CPU 忙碌。

    【讨论】:

      猜你喜欢
      • 2016-02-01
      • 1970-01-01
      • 2011-06-26
      • 2021-08-15
      • 2012-06-08
      • 2011-10-11
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多