node.js - 在 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
什么?
解决方案
您有三个基本选择:
重新设计
loadRound()
,使其不会阻塞事件循环。由于您没有共享任何代码,我们无法就其可行性提供建议,但如果它正在执行任何 I/O,那么它不需要阻塞事件循环。即使它只是 CPU 工作,它也可以设计成小块完成它的工作,以允许事件循环一些周期,但通常以这种方式重新设计它比下面的选项 2 和 3 需要更多的工作。移动
loadRound()
到工作线程(node.js 中的新线程)并通过消息传递回结果。使用 child_process 模块移动
loadRound()
到单独的 node.js 进程,并通过任意数量的方式(stdio、消息传递等)将结果传回。
推荐阅读
- javascript - 启用禁用的输入类型图像不起作用
- scala - scala中的演员参考
- python - 如何在另一个函数中使用来自一个函数的数据?
- javascript - 用逗号分隔循环中的每个项目
- python - 如何在 gekko 中动态构建约束?
- arduino - 安装后 Visual Studio Code Platform IO 缺少图标
- cassandra - dsbulk 卸载丢失的数据
- flutter - 在运行时将图像从计算机上传并显示到 FLUTTER WEB APP
- angular - 如何在Angular 9中的所有组件中使用带有表单的单个模态?
- java - Eclipse JAXRS POST 请求有效负载未转换为请求模型对象