2014-05-01 110 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 /其他嵌入器如何實現它。