电子渲染过程中奇怪的多线程行为

时间:2017-07-15 16:08:01

标签: javascript node.js multithreading electron

请考虑以下代码。

const fs = require('fs');

let loops = 0;

function loop() {
    fs.readdir(__dirname, () => {
        loops++;
        console.log('loop1 #' + loops);
        loop();
    });
}
loop();

setInterval(() => {
    loops++;
    console.log('loop2 #' + loops);
}, 100);

有两个异步循环递增相同的值。一个使用setInterval,另一个使用节点的异步方法之一。如果使用基本node.js运行此命令并在任一回调中放置断点,则执行将按预期停止。

但现在将此代码放在boilerplate electron.js apprenderer.js内,并在第二个循环中放置一个断点。

发生了一件奇怪的事情。

strange

看起来,即使循环2暂停,循环1继续工作,将“loop1 #xxx”输出打印到控制台并更新共享内存。

仅当我在浏览器本机异步方法(setIntervalsetTimeout)内暂停并观察节点原生效果时才会出现效果。所有其他组合(浏览器 - >节点,节点 - >节点,浏览器 - >浏览器)按预期暂停所有执行。

这怎么可能?这几乎就像电子有两个javascript运行循环,它们被焊接在一起,调试器只会影响“浏览器”的运行循环。

如果是这种情况,是否存在此行为的线程影响?我是否必须在节点和基于浏览器的回调之间共享的代码中添加锁?

0 个答案:

没有答案