对事件循环的一点理解
最近工作需要学习了解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是单线程事件循环机制,整体执行顺序如下;
- 第一次主线程运行: 输出 4444; 向we bworker发送信息’hello’;
- 事件循环第一次: 主线程发送的hello触发子线程: 输出 333333 -> 发送 ‘hello, I\’m send before message’ -> 输出 22222 -> 发送 ‘Hello, I\’m listening’ -> 输出hello;
- 事件循环第二次: 输出11111 -> 输出: ‘hello, I\’m send before message’;
- 事件循环第三次: 输出11111; 输出: ‘Hello, I\’m listening’
总结: 当前发送的事件触发信号会在下一次事件循环时触发.