Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使时间密集型函数异步_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 使时间密集型函数异步

Javascript 使时间密集型函数异步,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,使时间密集型函数(如图像处理)异步运行以允许其他代码运行或允许所述函数的多个实例并行运行的最佳方法是什么?(可以是特定于节点的)例如,如fs.readFile()或fetch()(XHR)。因为Node.js以单线程方式运行Javascript(一次只能执行一段Javascript),如果计算密集型图像处理当前都是Javascript代码,然后,与其他Javascript并行运行图像处理的选项如下: 启动一个或多个工作进程(可以运行node.js代码或任何其他您想要的程序),并在单独的进程中执行

使时间密集型函数(如图像处理)异步运行以允许其他代码运行或允许所述函数的多个实例并行运行的最佳方法是什么?(可以是特定于节点的)例如,如fs.readFile()或fetch()(XHR)。

因为Node.js以单线程方式运行Javascript(一次只能执行一段Javascript),如果计算密集型图像处理当前都是Javascript代码,然后,与其他Javascript并行运行图像处理的选项如下:

  • 启动一个或多个工作进程(可以运行node.js代码或任何其他您想要的程序),并在单独的进程中执行图像处理。然后,它们可以通过任何形式的进程间通信返回结果。这可能是node.js中解决CPU密集型问题最常用的方法(将CPU密集型的内容卸载到其他进程)。您可以使用子进程模块启动这些其他进程并与它们通信

  • 为node.js编写一个本机代码插件,该插件使用本机线程和本机代码来执行图像处理,并为node.js代码提供一个异步接口。然后,您可以从node.js异步调用该接口,并在接口完成时收到通知,但node.js在工作时可以自由处理其他事情

  • 将图像处理分解为非常小的工作块,这样您就可以执行一小块工作(如几毫秒的工作),安排下一块工作在几毫秒内运行,并将控制权返回事件子系统,以便它可以处理与您的小块工作交错的其他事件。仅供参考,设计复杂的代码以小规模运行是很困难的。最终,您必须构建一个状态机,它可以完成少量的工作并返回,只需要稍后调用它来完成更多的工作


  • 谢谢。请看一下。如果你想要节点特定,用C++作为ADDON模块,并用回调或返回承诺的签名来公开它,并使用V8中的LIBUV模式来执行它作为线程任务。这将使其异步,而不会由于间歇地向事件循环屈服而损失任何效率。或者,您可以将其保持同步,并将其作为
    子进程运行,以将其放在单独的线程中。谢谢。因此,从本质上讲,Web Workers是浏览器解决方案,而child_process/cluster是节点解决方案,对吗?至于ADDON模块,我不太了解C++或其他任何母语,只是JS和Python,所以我更愿意使用我所知道的(至少有点),至少现在。@ Drjk,这与您对方法3的评论一致。此外,为了引入用于异步性的状态机,不可避免地进行去优化,从而严重限制了性能,并在这两者之间重复地向其他事件屈服#2将是长期的“理想”方法,而#1似乎是易于实现和性能之间的良好平衡。@PatrickRoberts-不。这一评论被放在了错误的问题上。对不起,我会在这里删除它。