NodeJS:阻塞作业的asynchronous映射

让我们举一个例子,我有一个巨大的数组被串化的JSON。 我想遍历这个数组,并使用JSON.parse(阻止事件循环)将所有string转换为JSON。

var arr = ["{...}", "{...}", ... ] //input array 

这是第一种方法(可能会阻塞事件循环一段时间):

 var newArr = arr.map(function(val){ try{ var obj = JSON.parse(val); return obj; } catch(err){return {};} }); 

第二种方法是使用async.map方法(与第一种方法相比,这会更有效吗?):

 var newArr = []; async.map(arr, function(val, done){ try{ var obj = JSON.parse(val); done(null, obj); } catch(err){done(null, {});} }, function(err, results){ if(!err) newArr = results; } ); 

如果第二种方法相同或几乎相同,那么在node.js中这样做的有效方式是什么?

我遇到了subprocess ,这是否会成为这个问题的一个好办法?

我不认为async.map保证同步函数的非阻塞处理。 虽然它包装你的函数与asyncify函数,我找不到任何代码,实际上使其非阻塞。 这是我在过去遇到的asynchronous问题之一(但也许现在已经改进了)

你一定可以用自己的subprocess来处理自己的解决scheme,但是使用https://github.com/audreyt/node-webworker-threads

使用async.map但将callback包装在setImmediate(done)

我发现asyncfunction相当方便,但效率不高。 如果映射的计算速度非常快,则每10次调用setImmediate调用一次,直接调用它否则运行速度会更快。 (setImmediate分解调用堆栈并传递给事件循环,但setImmediate开销不可忽略)