我有一个node.js程序,可以运行大约50个不同的python脚本实例。我希望能够限制阶段-这样在任何时候,只有4个进程将并行运行。
我尝试了一个简单的循环,该循环调用了一个运行4个python脚本实例的函数。我使用了60秒的延迟,因为这是脚本运行的平均时间。
function startPythonScraping(){
for(var i = 0; i < finalList.length; i++){
setTimeout(function(){
runFourProccesses(finalList[i]);
}, i*60*1000);
}
}
function runFourProccesses(stockSymbol){
console.log("working on " + stockSymbol);
for(var j = 0; j < 4; j++){
if(j == 0){
trueOrFalse = "y"
} else {
trueOrFalse = "n"
}
let secondPythonProcess = spawn('python', ["/Users/nybgwrn/Desktop/AlphaSecWebsite/getAllData.py", stockSymbol, (j*10).toString(), "10", trueOrFalse]);
secondPythonProcess.stdout.on('data', (data) => {
let messegeFromPython = JSON.stringify(data.toString('utf8')).replace("\\n", "");
console.log(messegeFromPython + " with stock " + stockSymbol);
if(messegeFromPython != "something went wrong"){
//console.log("created file for " + symbol);
} else {
//console.log("couldn't create file for " + symbol + "_" + (j*10).toString() + "-" + (j*10 + 10).toString());
}
});
}
}
它不起作用,因为以某种方式索引以50而不是0开头,并且我还希望有更好的解决方案,因为我想确保仅运行4个实例。
答案 0 :(得分:0)
通常使用信号量来完成。信号量基本上是一个锁池,因此可以同时持有多个锁。
在您的情况下,您可以使用this package并用sem.take
和sem.leave
包装产生的每个python进程。