在node.js中协调并行执行

在node.js中协调并行执行,第1张

在node.js中协调并行执行

由于node.js是单线程的,因此没有什么是真正并行的。但是,可以安排多个事件并按照您无​​法事先确定的顺序运行。而且诸如数据库访问之类的事情实际上是“并行的”,因为数据库查询本身在单独的线程中运行,但是在完成时会重新集成到事件流中。

那么,如何安排多个事件处理程序的回调?好吧,这是浏览器端javascript动画中使用的一种常用技术:使用变量来跟踪完成。

这听起来像是骇客,确实如此,听起来很混乱,可能会留下一堆全局变量来进行跟踪,而使用的语言则更少。但是在javascript中,我们可以使用闭包:

function fork (async_calls, shared_callback) {  var counter = async_calls.length;  var callback = function () {    counter --;    if (counter == 0) {      shared_callback()    }  }  for (var i=0;i<async_calls.length;i++) {    async_calls[i](callback);  }}// usage:fork([A,B,C],D);

在上面的示例中,我们通过假设异步和回调函数不需要参数来使代码保持简单。您当然可以修改代码以将参数传递给异步函数,并使回调函数累加结果并将其传递给shared_callback函数。


附加答案:

实际上,即使是这样,该

fork()
函数也已经可以使用闭包将参数传递给异步函数:

fork([  function(callback){ A(1,2,callback) },  function(callback){ B(1,callback) },  function(callback){ C(1,2,callback) }],D);

剩下要做的唯一事情就是累积A,B,C的结果并将其传递给D。


甚至更多的答案:

我无法抗拒。早餐时一直在想这个。这是一个

fork()
累积结果的实现(通常作为参数传递给回调函数):

function fork (async_calls, shared_callback) {  var counter = async_calls.length;  var all_results = [];  function makeCallback (index) {    return function () {      counter --;      var results = [];      // we use the arguments object here because some callbacks       // in Node pass in multiple arguments as result.      for (var i=0;i<arguments.length;i++) {        results.push(arguments[i]);      }      all_results[index] = results;      if (counter == 0) {        shared_callback(all_results);      }    }  }  for (var i=0;i<async_calls.length;i++) {    async_calls[i](makeCallback(i));  }}

那很容易。这具有

fork()
相当普遍的目的,可用于同步多个非均匀事件。

Node.js中的示例用法:

// Read 3 files in parallel and process them together:function A (c){ fs.readFile('file1',c) };function B (c){ fs.readFile('file2',c) };function C (c){ fs.readFile('file3',c) };function D (result) {  file1data = result[0][1];  file2data = result[1][1];  file3data = result[2][1];  // process the files together here}fork([A,B,C],D);

更新资料

这段代码是在async.js之类的库或各种基于Promise的库存在之前编写的。我想相信async.js受此启发,但是我没有任何证据。无论如何..如果您今天想这样做,请查看async.js或promises。只要考虑上面的答案,就可以很好地解释/说明async.parallel之类的事情。

为了完整起见,以下是您的处理方式

async.parallel

var async = require('async');async.parallel([A,B,C],D);

请注意,其

async.parallel
工作原理与
fork
我们上面实现的功能完全相同。主要区别在于
D
,按照node.js约定,它将错误作为第一个参数传递给回调函数,并将回调作为第二个参数传递给回调函数。

使用promise,我们将其编写如下:

// Assuming A, B & C return a promise instead of accepting a callbackPromise.all([A,B,C]).then(D);


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5509294.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存