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