Как обработать по 1 миллион строк в 100 потоков?
У меня в бд есть 1 млн строк. Мне нужно их обработать в 100 потоков.
Я решил использовать модуль worker_threads
.
const ServerWorkers = [];
for (let index = 0; index < servers.length; index++) {
const server = servers[index];
const ip = server[0];
const threads = server[1];
for (let thread = 1; thread <= threads; thread++) {
const worker = new Worker('./worker.js', {
workerData: ip
});
ServerWorkers.push(worker);
}
}
console.log(`Создано ServerWorkers: ${ServerWorkers.length}`)
У меня создается 100 воркеров.
Далее мне нужно получить из БД строки которые нужно обрабатывать.
Но получать 1 млн строк - я думаю это очень сильно нагрузит систему. Поэтому я бы хотел получать порционно по 1000 строк, обрабатывать их воркерами и получать следующую 1000 строк. и так по кругу.
Не понимаю как организовать порционную выборку строк и как их передавать воркерам по очереди (свободным).
Буду благодарен за помощь!
Вот такой функцией я могу взять 1000 строк:
async function getOrdersForChecked(task, limit) {
let getEmails = await client.query({
query: `SELECT email FROM orders WHERE id_task = ${task} AND checked = 0 ORDER BY id_task LIMIT ${limit}`,
format: 'JSONEachRow',
});
getEmails = await getEmails.json();
return getEmails;
}
Источник: Stack Overflow на русском