Как обработать по 1 миллион строк в 100 потоков?

Рейтинг: 0Ответов: 0Опубликовано: 20.06.2023

У меня в бд есть 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;
}

Ответы

Ответов пока нет.