如何定期运行任务而不阻塞事件循环?
问题描述:
我有这样一段代码大阵列上运行:如何定期运行任务而不阻塞事件循环?
for (i = 0; i < cars.length; i++) {
cars[i] = some_function(cars[i]) ;
}
,我应该不会阻塞事件循环运行的时间间隔的代码。什么是正确的方法来做到这一点?
答
对于部分不堵事件循环,你有两个选择,甚至更多:
- 加载了你的工作再上一个child process或worker
- 组块的处理中
some_function
与process.nextTick
把控制权回到大块之间的事件循环
如果可以分块,你必须弄清楚你的函数没有任何细节。
对于部分间隔,您应该将代码包装在setInterval
内。
答
有一个很好的异步处理程序库Bluebird,它正在成为NodeJS异步协调的主要工具。
蓝鸟有一个非常有用的方法对设计用于数组:map
和mapSeries
。使用起来很简单,可以让你迭代数组而不会阻塞事件循环,并且使代码非常易读:
var Promise = require('bluebird'),
cars = ['a', 'b', 'c'];
// Iterate across cars without blocking the event loop. Each
// callback will be made in PARALLEL:
// @see http://bluebirdjs.com/docs/api/promise.map.html
Promise.map(cars, function(car) {
console.log("I'm logging car ' + car + ' but could be any complex code...');
});
// Iterate across cars without blocking the event loop. Each
// callback will be made in SERIES. An item will be fully processed
// before moving on to the next:
// @see http://bluebirdjs.com/docs/api/promise.mapseries.html
Promise.mapSeries(cars, function(car) {
console.log("I'm logging car ' + car + ' but could be any complex code...');
});
你想'setInterval'? –
使用递归和'setTimeout'你会得到预期的结果。请看这个[answer](http://stackoverflow.com/questions/33768726/blocking-event-loop) –
不幸的是,你不能,node.js是单线程的,所以每个大任务都会阻塞事件循环。如果你想运行大型任务,你应该在新的过程中完成。 – alexmac