2014-05-01 79 views
4

所有语言如何实现异步回调?如何实现异步回调?

例如在C++中,需要有一个“监视线程”来启动std::async。如果它在主线程中启动,它必须等待回调。

std::thread t{[]{std::async(callback_function).get();}}.detach(); 

v.s.

std::async(callback_function).get(); //Main thread will have to wait 

JavaScript中的异步回调怎么样?在JS回调中大量使用... V8如何实现它们? V8是否会创建大量线程来侦听它们并在获取消息时执行回调?还是它使用一个线程来监听所有回调并保持清爽?

例如,

setInterval(function(){},1000); 
setInterval(function(){},2000); 

不V8创建2个线程和监控每个回调状态,或者它有一个游泳池的事情来监控所有的回调?

+1

AFAIK,SO主要用于特定的编程问题。也许程序员.stackexchange.com更适合这个问题? – Johan

+1

相关:[Nodejs事件循环](http://stackoverflow.com/q/10680601/1048572) – Bergi

+1

可能重复[如何单线程非阻塞IO模型在Node.js中工作](http://stackoverflow.com/questions/14795145/how-the-single-threaded-non-blocking-io-model-works-in-node-js) – usr

回答

5

V8没有实现带回调的异步函数(包括setInterval)。引擎只是提供一种执行JavaScript代码的方法。

作为V8嵌入器,您可以创建setInterval链接到您的本地C++函数的JavaScript函数,以实现您想要的效果。例如,创建线程或安排一些工作。此时,您有责任在必要时调用提供的回调函数。一次只有一个线程可以使用V8引擎(V8隔离实例)来执行代码。这意味着如果需要从另一个线程调用回调,则需要同步。 V8提供了锁定机制,你需要这个。

解决此问题的另一种更常见的方法是为V8创建一个函数队列,以执行并使用无限队列处理循环在一个线程上执行代码。这基本上是一个事件循环。这样您就不需要使用执行锁定,而是使用另一个线程将回调函数推送到队列中。

所以它取决于浏览器/ Node.js /其他嵌入器如何实现它。