1. 程式人生 > >對事件循環的一點理解

對事件循環的一點理解

.post require 順序 this ref abcd his cti 如何

最近工作需要學習了解webworker-threads以應對Javascript多線程處理CPU密集型的可能性;參考文檔JavaScript多線程之二 Node.js中的Web Worker;

以下是自己的一次嘗試並引發的對於Javascript事件循環機制的一點理解

        var Worker = require(‘webworker-threads‘).Worker; 

        var worker = new Worker(function() { 
            console.log(33333) 
            postMessage(‘hello, I\‘m send before message‘); 
            this.onmessage = function(event) { 
                console.log(22222); 
                postMessage(‘Hello, I\‘m listening‘); 
                console.log(event.data); 
            } 
        }) 

        worker.onmessage = function(event) { 
            console.log(11111) 
            console.log(event.data); 
        } 
        console.log(4444); 
        worker.postMessage(‘hello‘); 

輸出結果為:

4444 
33333 
22222 
hello 
11111 
hello, I‘m send before message 
11111 
Hello, I‘m listening 

那麽思考一下這個結果是如何產生的?

首先,確定Javascript是單線程事件循環機制,整體執行順序如下:

  1. 第一次主線程運行: 輸出 4444; 向we bworker發送信息’hello’;
  2. 事件循環第一次: 主線程發送的hello觸發子線程: 輸出 333333 -> 發送 ‘hello, I\’m send before message’ -> 輸出 22222 -> 發送 ‘Hello, I\’m listening’ -> 輸出hello;
  3. 事件循環第二次: 輸出11111 -> 輸出: ‘hello, I\’m send before message’;
  4. 事件循環第三次: 輸出11111; 輸出: ‘Hello, I\’m listening’

總結: 當前發送的事件觸發信號會在下一次事件循環時觸發.

對事件循環的一點理解