[英]Javascript Concurrency Control
作為一個教育項目,我正在用JavaScript編寫(又一個)編輯風格的實時語法高亮顯示器。
為了保持編輯器的響應性,我顯然選擇了熒光筆異步運行,但是對於我正在使用的模型我需要能夠在啟動另一個之前終止一個熒光筆,如果在當前熒光筆完成之前鍵入了某些東西,並且知道它已經終止在新的開始之前。
我在考慮做以下事情:
var terminate = false;
var terminated = false;
function work() {
while(!terminate)
console.log('working');
terminated = true;
}
function stop() {
terminate = true;
while(!terminated);
console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 10);
然而,這個例子不起作用,我嘗試使用更多的setTimeouts代替繁忙的等待也無濟於事。
有沒有辦法在JavaScript中實現這樣的系統,或者我應該使用一些替代(或兩者)?
如果您可以在沒有DOM訪問的情況下完成大部分工作,那么對於Web工作者來說這將是完美的。
要修復您的示例,請嘗試使用帶有0
setTimeout
進行控制。 這有效:
var terminate = false;
var terminated = false;
function work() {
if(!terminate) {
console.log('working');
setTimeout(work, 0);
}
else terminated = true;
}
function stop() {
terminate = true;
if(!terminated) {
setTimeout(stop,0);
}
else console.log('stopped');
}
setTimeout(work, 0);
setTimeout(stop, 100);
編輯
要解釋原始代碼段的問題:Javascript是單線程的(除非您使用的是Web worker)。 您可以使用事件,回調和setTimeout來實現並發的錯覺,但您真正要做的是告訴運行時在將來某個時間執行您的回調函數。 在你的情況下, stop
永遠不會被執行。 在10毫秒到期后,計划運行'下一步'(即work
完成后。由於work
從未完成, stop
可能永遠不會運行。
因此,您希望從javascript中獲得的任何明顯的並發性都將是合作的。 你的工作線程必須暫停並明確允許“其他東西”發生以保持幻覺。
在這種情況下考慮使用工人 。 大多數現代瀏覽器都支持它們。 沒有工人,javascript中沒有真正的可靠性(這很好) - 所有都是在一個線程中完成的。
很多setTimeout()
調用都是殺手鐧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.