2017-07-14 57 views
0

我需要控制我正在創建的Node.js腳本中的併發性。目前我正在嘗試使用npm promise-task-queue,但我願意接受其他建議。如何控制javascript中的併發性?

我不知道如何在我的代碼中實現promise-task-queue。這是我原來的計劃:

readURLsfromFile().then((urls) => { 

    urls.reduce((accumulator, current, i) => { 
     return accumulator.then(() => { 
      return main(urls[i], i, urls.length) 
     }) 
    }, Promise.resolve()) 
}) 

正如你可以看到我在讀從文件的URL,然後使用。降低()來運行的main()在這些網址中的每一個系列。串行速度太慢,所以我需要通過可控併發來實現。

這裏是我開始使用承諾任務隊列(這是非常錯誤的,我不知道我在做什麼)來編寫代碼:

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)}); 
}) 

正如你可以看到我已經把我的主()函數的參數後Promise.try,我已經把我的參數後返回queue.push。不知道這是否正確。

但不管現在我卡住了,我如何將所有迭代加載到隊列中?

+0

可能有不同的方式來做你想做的事情。你究竟想要做什麼? – Aron

+0

@Aron我試圖運行使用受控併發的main()。 – JPB

回答

0

您可以使用npm:https://www.npmjs.com/package/qew中的qew模塊。使用npm install qew安裝。

初始化你做

const Qew = require('qew'); 

const maxConcurrent = 3; 
const qew = new Qew(maxConcurrent); 

使用上面的代碼qew現在將是一個隊列,允許你推異步功能上,將與3

最大併發若要推動執行新的異步功能到QEW你可以做

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,並等待他們都做的事情與他們之前解決。

完整免責聲明:我是此軟件包的作者。