所有语言如何实现异步回调?
例如,在C++中,需要一个"监视线程"来启动std::async
.如果它在主线程中启动,则必须等待回调.
std::thread t{[]{std::async(callback_function).get();}}.detach();
VS
std::async(callback_function).get(); //Main thread will have to wait
那么JavaScript中的异步回调呢?在JS中大量使用回调... V8如何实现它们?V8是否会创建大量线程来监听它们并在收到消息时执行回调?或者它是否使用一个线程来监听所有回调并保持刷新?
例如,
setInterval(function(){},1000); setInterval(function(){},2000);
V8是否创建了2个线程并监视每个回调状态,或者它有一个池来监视所有回调?
V8没有使用回调实现异步函数(包括setInterval).Engine简单地提供了一种执行JavaScript代码的方法.
作为V8 setInterval
嵌入器,您可以创建链接到您的本机C++函数的JavaScript函数,该函数可以执行您想要的操作.例如,创建线程或安排一些工作.此时,您有责任在必要时调用提供的回调.一次只有一个线程可以使用V8引擎(V8隔离实例)来执行代码.这意味着如果需要从另一个线程调用回调,则需要同步.V8提供的锁定机制是你需要的.
解决此问题的另一种更常见的方法是为V8创建一个函数队列来执行并使用无限队列处理循环来在一个线程上执行代码.这基本上是一个事件循环.这样您就不需要使用执行锁,而是使用另一个线程将回调函数推送到队列.
所以它取决于浏览器/ Node.js /其他嵌入器如何实现它.