首页 > 解决方案 > 在 node.js 中运行同步代码而不阻塞的正确方法

问题描述

我有一个 websocket 服务器node.js,允许用户解决给定的难题。

我还有一个代码可以生成大约 20 秒的随机谜题。与此同时,我仍然想处理新的连接/断开连接,但是这个同步代码blocks the event loop

这是简化的代码:

io.on('connection', socket => {
//
});

io.listen(port);

setInterval(function() {
    if (game.paused)
        game.loadRound();
}, 1000);

loadRound运行大约 20 秒,这会阻止所有连接和 setInterval 本身

没有运行此代码的正确方法是blocking event loop什么?

标签: node.jsasynchronousblockingnonblockingevent-loop

解决方案


您有三个基本选择:

  1. 重新设计loadRound(),使其不会阻塞事件循环。由于您没有共享任何代码,我们无法就其可行性提供建议,但如果它正在执行任何 I/O,那么它不需要阻塞事件循环。即使它只是 CPU 工作,它也可以设计成小块完成它的工作,以允许事件循环一些周期,但通常以这种方式重新设计它比下面的选项 2 和 3 需要更多的工作。

  2. 移动loadRound()工作线程(node.js 中的新线程)并通过消息传递回结果。

  3. 使用 child_process 模块移动loadRound()到单独的 node.js 进程,并通过任意数量的方式(stdio、消息传递等)将结果传回。


推荐阅读