2013-05-25 32 views
11

下圖摘自Jon Resig編寫的書籍Secrets of the JavaScript Ninja的第3章。這裏作者正在解釋瀏覽器事件循環。在瀏覽器中運行的JavaScript的單線程概念

enter image description here

書中有這樣說:

需要注意的是,它將在事件 到隊列中的瀏覽器機制是外部事件循環模式是很重要的。處理 確定何時發生事件並將它們推送到 事件隊列不需要參與處理事件的線程的處理 。

所以我的問題是正確的說瀏覽器中的JavaScript是單線程?我問這個問題,因爲很明顯,兩個單獨的任務(處理事件和事件隊列在這裏並行進行)。

+0

通過所謂的**即時回調**(如[本答案](http://stackoverflow.com/a/2734311/1711186)中所述)可能會引起上述問題(也許)更有趣。簡而言之,這樣的**立即回調**將是Javascript代碼運行,而其他代碼由阻塞語句(即'alert()')終止尚未[運行完成](https://developer.mozilla.org /en-US/docs/Web/JavaScript/Guide/EventLoop#.22Run-to-completion.22)。由此看來,第二個任務「事件排隊」可以引入多線程問題(即確定性)。好問題! – humanityANDpeace

+0

可能的重複[是否javascript保證是單線程?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded) – Liam

回答

9

JavaScript在任何地方,瀏覽器或NodeJS都是單線程的。它永遠不會是應該支持多線程以任何方式(也可能是,如果有人實現了某種多線程的JS引擎,不好的事情會發生,這是肯定)

編輯回答您的編輯:

這一事件隊列充滿了來自瀏覽器主循環的數據(鼠標/ kb事件,網絡事件等)。那個運行JS的主循環。你發佈的數字是正確的,但它(一種)模糊了現實。 AFAIK只有一個線程處理所有事情(即填充隊列並逐行運行,任何JS代碼)。

編輯:一種方法來證明這一點:創建一個非常長的循環和文本區域。嘗試在循環運行時寫入文本。你不能:這是因爲主循環忙於運行循環,所以無法處理kb事件。

編輯:這似乎是一個很好的答案:最後的編輯Is JavaScript guaranteed to be single-threaded?

2年後:這個答案是越來越有點老脫離現實。之後,io.js(以及後面的node.js,可能是Chrom [e | ium],FF,Safari)正在推動多進程支持(通過工作人員)。您可以查看更多關於here的信息。

+0

@alexandernst因爲你引用[是保證JavaScript是單線程?](http://stackoverflow.com/questions/2734025/is-javascript-guaranteed-to-be-single-threaded?rq=1)問題我想知道你是否想要重新考慮聲明「AFAIK處理所有事情(即填寫隊列和運行,**逐行**,任何JS代碼)」?流行語是**立即回調**,正如在[此問題的頂部回答](http://stackoverflow.com/a/2734311/1711186)中明智提及的。你怎麼看? – humanityANDpeace

+0

@humanityANDpeace事實上,這是一個有趣的閱讀。我真的不確定每個瀏覽器究竟會如何處理您正在運行一段非常長的代碼並立即回調的情況。無論如何,我可以向你保證的一件事是:如果你接受這個概念,它會適得其反,保證。 JS並不是運行任何類型的多線程/多進程/多任務。 – alexandernst

+0

@alexandernst我做了一些進一步的檢查。當我使用'alert()'來暫停某些執行時,使用firefox我可以重現**即時回調/事件**的這種「無用」行爲。我仍然懷疑這是否只是Firefox的一個bug。你有沒有發現閱讀規範,知道什麼「應該」是處理併發的方式? – humanityANDpeace