Я запускаю цикл for для создания всех возможных IPv4-адресов, а затем просматриваю их в файле mmmb maxmind. Проблема в том, что цикл for слишком быстр, поиск maxmind относительно медленный, и, следовательно, процессы замедляются, и в конечном итоге моя система зависает после нескольких итераций на 400 тыс. Если бы я читал из какого-то потока, я бы приостановил поток после прочтения каждого IP-адреса 10 000 и возобновил бы только тогда, когда все они были просмотрены из файла mmdb. Но как я могу получить такой контроль для цикла for?Node.js: Как приостановить/возобновить цикл for
connectToMaxMindDatabases().then(function (done){
for(var i=0; i<256; i++){
for(var j=0; j<256; j++){
for(var k=0; k<256; k++){
for(var l=0; l<256; l++){
count++;
if(count % 1000 == 0){
console.log("count", count);
}
var newIP = getIPV4([i,j,k,l])
ispDB.getGeoDataAsync(newIP).then(function (result){
if(result){
console.log(count, newIP, result);
// process.exit();
}
});
}
}
}
}
})
function getIPV4(bytes){
return bytes.join(".")
}
Обратите внимание, что Node.js имеет неблокирующую философию, поэтому я думаю, что остановка цикла, возможно, не является хорошим выбором. Может быть, какая-то очередь? –
Знаете ли вы об ошибке в вашем примере кода, потому что 'getGeoDataAsync' является асинхронным, к моменту его возврата возвращается' count' будет увеличиваться на непредсказуемую сумму? Не уверен, что это имеет отношение к вашей логике, но это определенно то, что вы упускаете из виду. – marekful
@marekful Я понимаю вашу точку зрения. Однако это не вызывает никаких проблем, так как мне нужно обработать все IP-адреса. Если вместо цикла for это был файл, это не вызвало бы никаких проблем, так как я бы приостановил поток после чтения, скажем, каждые 1k записей и возобновлялся только тогда, когда это число записей было обработано maxmind. Я бы сохранил для этого отдельный счетчик. Но я согласен с Адамом, приостановление цикла for будет катастрофическим. Я думаю сначала написать все перестановки в файл. –