节点 child_processes 不并发执行

时间:2021-04-14 01:28:16

标签: node.js child-process

背景

我想以编程方式在单独的浏览器选项卡中导航到多个网站。理想情况下,我希望能够在触发代码时并行加载这些网站。

问题

作为概念证明,我有以下代码可以通过命令打开浏览器。

const { exec } = require("child_process");

exec('xdg-open https://www.google.com').on('exit', () => {console.log('child 1 exited')})
exec('xdg-open https://www.github.com').on('exit', () => {console.log('child 2 exited')})

当我运行上面的代码时会发生什么:

  1. 在我运行代码后几乎立即记录了 child 1 exitedchild 2 exited
  2. 浏览器标签页打开并开始加载其中一个页面。我不得不等待大约 3 秒钟加载第一页后,然后第二个选项卡打开并开始加载第二页。

++

我希望两个选项卡几乎同时打开并开始加载页面,但这并没有发生。

其他观察

我尝试在不同的终端中运行 xdg-open https://www.google.comxdg-open https://www.github.com(大约同时执行),并且我能够打开 2 个标签并同时开始加载页面(这是我的目标行为)

然而,上面的代码似乎与运行 xdg-open https://www.google.com && xdg-open https://www.github.com

的行为类似

问题

如果 exec() 产生一个新的 child_process,为什么上面的代码没有同时触发多个页面导航?我如何实现这种行为?

2 个答案:

答案 0 :(得分:0)

我建议您使用 npm 中的 open。从 Node.js APP 打开多个 URL 将是一个不错的选择。

const open = require('open');

const main = async () => {
  await open('https://www.github.com');
  await open('https://google.com');
}

main();

此代码将并行打开这些 URL,并将在所选的默认浏览器中打开。但是,您可以更改 open 中的配置以将动态配置传递给它。请查看here了解更多详情。

您不应使用 child_process 来打开此类任务,因为它不需要任何计算。这些通常在 CPU 无法处理阻塞请求时调用,因为 Node.js 主循环在单线程上运行。您可以查看 here 以了解何时使用 child_process 的更多详细信息。

答案 1 :(得分:0)

我发现只有在我的默认浏览器设置为 Firefox 时才会出现此问题。如果我的默认浏览器设置为 chrome,两个浏览器选项卡将同时打开并开始从两个网站获取数据(同时)。

我在此发布此观察结果,以防有人发现它有用,但我还没有找到使 Firefox 能够正常工作的解决方案。

编辑:

更多观察

当我尝试以相同的方式打开更多网站时(例如 10 个网站),firefox 将分 2 批打开(每批之间有一些延迟)。每批将同时打开多个网站。到目前为止,它似乎总是分两批开放。

相关问题