最近工作需要学习了解webworker-threads以应对Javascript多线程处理CPU密集型的可能性;参考文档;
以下是自己的一次尝试并引发的对于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’
总结: 当前发送的事件触发信号会在下一次事件循环时触发.