簡體   English   中英

終止WebWorker(JavaScript)

[英]Terminate a WebWorker (Javascript)

我正在編寫一種用於教育目的的語言,該語言應在網絡瀏覽器中運行。 該語言可編譯為JavaScript。

因此存在無限循環和遞歸的問題。 在那之前,我認為解決方案是將運行時實現為WebWorker,並在ui上添加一個按鈕,如果運行時間過長,則將其終止。

我只是在測試我的語言時發現,通過調用runtime.terminate() ,Web Worker並沒有真正終止。

至少直到他的上一份工作完成為止,我還沒有測試如果完成該怎么辦。 即使在到目前為止找到的文檔中,它也指出它會立即停止執行。

因此,即使用戶可以繼續那樣工作,后台正在運行的工作程序也可能耗盡資源並導致瀏覽器至少沒有響應。

因此,為了響應用戶事件,在發生無限循環或遞歸的情況下,我需要任何方法來終止執行。 由於我找不到任何使線程在JavaScript中進入睡眠狀態的方法,因此該方法也不起作用,或者Web工作人員是否有諸如睡眠之類的東西?

您有什么建議我可以做什么?

我會這樣做:

1)讓編譯器生成代碼,而不是從頭到尾執行該程序,而是將其分成多個段-例如,循環的主體或函數的主體可以是一個段。

2)每個段應以timeoutId = setTimeout(nextSegment, 0) 這允許Web Worker在執行段之間接收並響應異步事件。

3)當您要終止Web Worker時,請使用window.postMessage()向其發送異步消息。

4)在網絡工作者中,有一個事件處理程序,該事件處理程序在收到該消息后會執行clearTimeout(timeoutId)

感謝您的答復,我已經考慮過這種方式,因此實際上我不需要網絡工作者。 因此,這種方法的缺點是:

1)我將必須將循環實現為遞歸函數調用...

更大的問題2)段的大小必須限制為一個命令,這種方法才能真正起作用,因此我將必須將每個命令包裝到一個調用下一​​個命令的函數中,這將是巨大的開銷...

那就是為什么我要尋找解決方法(如果有)?

是的,我正在編寫一個編譯器。

在使用這種方法時,我必須提到,可能用戶的開銷可能不大,但是對編譯的影響確實很大……這就像在Javascript之上構建VM一樣……

我要說的是,除了上述要點之外,我還需要:

-需要用於函數命名的復雜索引系統-注意變量分配-必須解決串聯表達式-...

這就是為什么我在尋找更優雅的版本...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM