簡體   English   中英

如何在javascript中控制並發?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM