[英]How to control concurrency in javascript?
我需要控制正在制作的Node.js腳本中的並發性。 目前,我正在嘗試使用npm promise-task-queue,但是我願意接受其他建議。
我不確定如何在我的代碼中實現promise-task-queue。 這是我的原始程序:
readURLsfromFile().then( (urls) => {
urls.reduce( (accumulator, current, i) => {
return accumulator.then( () => {
return main(urls[i], i, urls.length)
})
}, Promise.resolve())
})
如您所見,我正在從文件中讀取URL,然后使用.reduce()在這些URL的每一個上串行運行main()。 串行速度太慢了,所以我需要控制並發性。
這是我開始使用promise-task-queue編寫的代碼(這是非常錯誤的,我不知道自己在做什么):
var taskQueue = require("promise-task-queue");
var queue = taskQueue();
var failedRequests = 0;
queue.on("failed:apiRequest", function(task) {
failedRequests += 1;
});
queue.define("apiRequest", function(task) {
return Promise.try( () => {
return main(urls[i], i, urls.length));
}).then( () => {
return console.log("DONE!");
});
}, {
concurrency: 2
});
Promise.try( () => {
/* The following queues up the actual task. Note how it returns a Promise! */
return queue.push("apiRequest", {url: urls[i], iteration: i, amountToDo: urls.length)});
})
如您所見,我將main()函數及其參數放在Promise.try之后,並將參數放在return queue.push之后。 不確定是否正確。
但是,不管現在我陷入困境,如何將所有迭代加載到隊列中?
您可以使用來自npm的qew模塊: https : //www.npmjs.com/package/qew 。
使用npm install qew
。
要初始化你做
const Qew = require('qew');
const maxConcurrent = 3;
const qew = new Qew(maxConcurrent);
使用上面的代碼qew
現在將成為一個隊列,允許您將異步函數壓入隊列,並以3的最大並發性執行。
要將新的異步功能推入隊列,您可以執行
qew.pushProm(asyncFunc);
因此,在您的情況下,如果我對您的理解正確,則可以執行類似
readURLsfromFile()
.then(urls => {
return Promise.all(urls.map(url => { // wait for all promises to resolve
return qew.pushProm(() => main(url)); // push function onto queue
}));
})
.then(results => {
// do stuff with results
})
在此代碼段中,您正在從文件中讀取URL,然后將一堆函數qew
加載到qew
,並等待它們全部解析,然后再對其進行處理。
完全免責聲明:我是該軟件包的作者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.