2016-01-18 67 views
1

它在很多網站上說JavaScript是單線程的。當他們這樣說時,他們是否指JavaScript運行時?當他們說JavaScript是單線程時,這意味着什麼?

我可能會誤解一些東西,但不是JavaScript只是一種編程語言,您使用它創建的程序應該被標記爲單線程?但是也許我不理解某些東西,那麼有人能解釋我沒有得到什麼嗎?

+0

可能重複http://stackoverflow.com/questions/21718774/how-is-javascript-single-threaded –

+0

語言是單線程會更準確我想 - 如果你想的是如何一個像樣的說明js有效,這[MDN頁面](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop)可以完成它的工作 –

+1

@JaromandaX:該語言不是單線程的。這個語言在線程方面幾乎沒有任何問題,這是一個非常不同的東西。 –

回答

3

JavaScript,語言,幾乎沒有關於線程的話題。無論是單線程還是多線程都是其運行環境的問題。有單線程JavaScript環境和多線程JavaScript環境。規範所要求的唯一真正的要求是一個線程有一個job queue,並且一旦一個作業(一個運行的代碼單元,如一個事件處理程序的調用單元)被啓動,它會在該線程上的另一個作業之前運行到完成隊列開始。也就是說,JavaScript具有運行至完成語義。

瀏覽器上的JavaScript 不是單線程並沒有多年。有一個主線程(用戶界面處理的線程)和任意數量的web worker線程。 Web工作人員無法直接訪問UI,他們會將messaegs發送到UI線程,並執行UI更新。線程不直接共享數據,它們通過消息傳遞顯式共享數據。與多線程訪問UI和相同的公共數據區域相比,這種分離使編程多線程代碼變得更加簡單並且不易出錯。 (編寫正確的多線程代碼,任何線程都可以在任何時間訪問任何內容)hard。)

在瀏覽器之外,NodeJS中的JavaScript運行在單個線程上。有一個Node的分支添加了多線程,但我認爲它沒有去過任何地方。

JVM上的JavaScript(Rhino,Nashorn)一直是多線程的,由JVM的線程設施支持。

1

雖然TJC的答案當然是正確的,但我不認爲它解決了當人們說「JavaScript是單線程」時人們實際意義的問題。他們實際上總結(不準確)的是,運行時必須像有單個執行線程那樣工作,這不能被預先佔用,而且必須運行到完成。只要最終結果以這種方式運行,實際的運行時就可以做任何它喜歡的事情。

這意味着,雖然JavaScript程序可能看起來與大量線程互相交互,但實際上並沒有這種類型。內核使用隊列,事件循環和運行至完成語義(簡要地)描述here來控制一切。

這與硬件描述語言(VHDL,Verilog,SystemC(雖然實際上不是語言)等)面對的問題完全相同。他們通過在'進程'之間運行一個不可搶佔的運行時內核循環,並且必須運行到定義的暫停點之前,給出了大規模並行的錯覺。這一點的目的是確保模型以確定的,可重複的方式執行。

HDL和JS之間的區別在於,它是非常好的定義和HDL的基礎,雖然它掩蓋了JS。這是SystemC LRM的一個摘錄,其中簡要介紹了它 - 例如,在VHDL LRM中定義得更好。

由於過程實例執行不中斷,只有單一 流程實例可以在任何一個時間處於運行狀態,並沒有其它進程 實例可以執行,直到當前執行的過程實例 已經產生控制給內核。一個進程不能搶先或中斷另一個進程的執行。這被稱爲 協同例程語義或合作多任務。

+0

我根本不稱之爲JS的「掩飾」,而不是[根據最新規範](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-jobs - 和作業隊列)。 '事先有點含糊不清(但在某些情況下已經確立)。 –

+0

謝謝,沒有看到。 – EML

相關問題