我有 Javascript 背景,非常习惯带有回调的异步调用。还精通 Promise 和异步等待。我最近开始开发 Roblox 游戏,它的 Lua SDK 提供了一堆不需要回调的 DoSomethingAsync 函数。我在网上查了一些资源,人们说异步调用后放弃了执行控制,直到结果返回,稍后控制权才返回。这允许开发人员编写代码,就好像事情是同步完成的一样。有人可以验证这是否属实吗?线程模型是否类似于 Javascript,其中解释器只有一个线程?
Lua 和 JavaScript 一样,一次只执行一个线程。然而,Lua 有一个称为协程的功能,允许不同的执行线程交错执行。(Lua协程有点类似于JavaScriptasync函数)
coroutine.resume(thread)将执行切换为thread(“现在轮到你了”)。的调用者coroutine.resume将在thread完成或调用时重新获得控制权coroutine.yield()(“我现在完成了,稍后再给我回电”)。
Roblox 有一个线程调度程序,当当前调度的线程让出时,它决定接下来运行哪个线程。线程调用时会产生收益wait()任何yield 函数时都会yield。
IO 请求是在 C++ 中的单独线程中完成的(就像 JavaScript 一样)。当 IO 请求完成时,调度程序会将请求 IO 的生成线程放在接下来要调度的队列的前面(与 Javascript 不同)。
上面的线程调度程序链接有一个示例wait(),展示了如何通过忙等待在纯 Lua 中实现。在 C++ 中,您可以使用 true sleep 来避免 CPU 忙碌。
| 归档时间: |
|
| 查看次数: |
8558 次 |
| 最近记录: |