@kolomat

Как разбить выполнение функции на разные ядра процессора в node js?

Добрый день, есть функция, по сути кусок парсера, она получает массив ссылок, дальше пробегается по ним, собирает данные и сохраняет.
async function getProductsData(link) {
    let productsUrl = await getProductsUrl(link)
    const cluster = await Cluster.launch({
        concurrency: Cluster.CONCURRENCY_PAGE,
        maxConcurrency: 20,
        monitor: false,
        puppeteerOptions: {
            headless: true,
            defaultViewport: false,
            devtools: false
        },
        timeout: 500000
    });

    cluster.on("taskerror", (err, data) => {
        console.log(`Error crawling ${data}: ${err.message}`);
    });

    let productsData = []

    await cluster.task(async ({page, data: url}) => {
        await page.goto(url)

        let product = await page.evaluate(async () => {
            let description = ''
            let product_attributes = []
            let name = document.querySelector('h1.product-name').innerText.trim()
            let sku = 'SH-' + document.querySelector('span[itemprop=sku]').innerText.trim()
            if (document.querySelector('div[itemprop=description]') !== null) {
                description = document.querySelector('div[itemprop=description]').innerHTML.replace(/\s{2,}/g, ' ').trim()
            }

            document.querySelectorAll('table.attribute > tbody > tr').forEach(el => {
                product_attributes.push('Общая:' + el.querySelector('td:nth-child(1)').innerText + ':' + el.querySelector('td:nth-child(2)').innerText)
            })

            let attributes = product_attributes.join('|').replace(/:\|\s*!/g, '|')

            let obj = {
                name,
                sku,
                description,
                attributes
            }

            return obj
        })
        productsData.push(product)
        fs.writeFileSync('./price/test.json', JSON.stringify(productsData))
    })

    for (url of productsUrl) {
        await cluster.queue(url);
    }

    await cluster.idle();
    await cluster.close();
}

Тоесть в
let productsUrl = await getProductsUrl(link)
Получается обычный одномерный массив ссылок
Суть вопроса в том, например в массиве 1000 ссылок, на сервере 4 ядра, возможно ли как то разбить массив и что бы каждый кластер получил эту функцию и получил по по числу ссылок и паралельно все это обрабатывал?
  • Вопрос задан
  • 64 просмотра
Пригласить эксперта
Ответы на вопрос 1
MvcBox
@MvcBox
Software Developer [C/C++/JS(for Node.js)/etc]
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы