在Roblox中Lua异步调用究竟是如何工作的?

时间:2018-04-11 00:29:32

标签: lua roblox

我来自Javascript背景,非常习惯使用回调进行异步调用。同样精通Promise和asynch等待。我最近开始研究Roblox游戏,它的Lua SDK提供了一堆DoSomethingAsync函数,它们不期望回调。我在线查找了一些资源,人们说在异步调用之后放弃了执行控制,直到结果返回并且控件稍后返回。这允许开发人员编写代码,就好像事情是同步完成的一样。有人可以验证这是否真的如此?线程模型是否类似于Javascript,其中解释器只有一个单独的线程?

2 个答案:

答案 0 :(得分:2)

Lua和JavaScript一样,一次只执行一个线程。但是,Lua有一个名为coroutines的功能,允许不同的执行线程交错执行。 (Lua协同程序有点类似于JavaScript async函数)

coroutine.resume(thread)将执行切换为thread("现在轮到你了#34;)。当coroutine.resume完成或thread coroutine.yield()时,wait()的调用者将重新获得控制权("我现在已经完成了,请稍后再给我回电话#34; )。

Roblox有一个thread scheduler,用于决定当前计划的线程产生时接下来要运行的线程。线程在调用wait()或任何yield函数时会产生。

IO请求在C ++中的单独线程中完成(就像JavaScript一样)。当IO请求完成时,调度程序将请求下一个队列前端的IO的生成线程放入其中(与Javascript不同)。

上面的线程调度程序链接有一个$(document.ready(function() { $('#btnLearn1').click(function(event) { $('a[href="' + $(this).attr('href') + '"][data-toggle="tab"]').not('.btn').parent().addClass('active'); }); }); 看起来的例子,通过忙等待在纯Lua中实现。在C ++中,您可以使用真正的休眠来避免CPU忙。

答案 1 :(得分:1)

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