Приостановка цикла, когда очередь заполнена - PullRequest
0 голосов
/ 31 января 2019

Я выполняю веб-сканер с puppeteer !.

Цикл передает функции (loadPage (URL)) действительный URL-адрес, но хотел бы приостановить циклкогда N страниц обрабатывается сканированием.

Я думал о том, чтобы сделать тайм-аут со средним временем, которое ученик тратит на бег.Но я не думаю, что это решение.Но я открыт для любой дискуссии.

Спасибо.

--- Редактирование для дальнейшего использования ---

const puppeteer = require('puppeteer');
const stores = require('./data.json').stores;

const MAX_CONCURRENT_TASKS = 5;
let TOTAL_PAGES = 0;

const start = async () => {
//@TODO Create a separate log routine
console.log('Total de Lojas', stores.length)

let actualStore = null;
let activatedStores = [];

for (const store of stores) {
    if (store.active) {
        activatedStores.push(store)
    }
}

//@TODO Create a separate log routine
console.log('Lojas ativas', activatedStores.length)

try {
    const browser = await puppeteer.launch({
        headless: false //Debug porpouse
    });
    const pagePool = await Promise.all(Array.from(
        new Array(MAX_CONCURRENT_TASKS),
        () => browser.newPage()
    ))

    while (activatedStores.length !== 0) {
        //@TODO Create a separate log routine
        console.log(`Stores left: ${activatedStores.length - MAX_CONCURRENT_TASKS}!`)
        await Promise.all(
            activatedStores.splice(0, MAX_CONCURRENT_TASKS)
                .map((store, i) => loadPage(store.siteMap, 
pagePool[i], store))
        )
    }

    await browser.close();

} catch (error) {
    //@TODO create function to generate error logs
    console.error(error)
}
}


/**
 *Function to load pages
 *
 * @param {string} url - a valid url
 * @param {puppeter} page - puppeteer browser.newPage()
 * @param {Object} store - the settings of this store
 */
const loadPage = async (url, page, store) => {
const opts = {
    timeout: 0,
    waitUntil: 'domcontentloaded'
}
page.setUserAgent('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36')

await page.goto(url, opts);

//@TODO Create a separate log routine
console.log(await page.evaluate(() => document.location.href));
}

start()

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Без кода трудно быть уверенным, что именно вам нужно.Может быть, этот пример может дать вам несколько советов.

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const urls = Array.from(
      new Array(20),
      (_, i) => `https://example.org/?foo=${i}`
    );
    const numberOfConcurrentTasks = 3;

    const browser = await puppeteer.launch();
    const pagePool = await Promise.all(Array.from(
      new Array(numberOfConcurrentTasks),
      () => browser.newPage()
    ));

    while (urls.length !== 0) {
      console.log(`URLs left: ${urls.length}.`);
      await Promise.all(
        urls.splice(0, numberOfConcurrentTasks)
            .map((url, i) => processDoc(url, pagePool[i]))
      );
    }

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

async function processDoc(url, page) {
  await page.goto(url);
  console.log(await page.evaluate(() => document.location.href));
}
0 голосов
/ 31 января 2019

Я не могу предоставить вам пример кода здесь, но, безусловно, вы должны рассмотреть концепцию итераторов и генераторов .Генераторы используют принцип неблокирующей паузы, который позволяет вам выполнять некоторые вычисления, останавливать и выполнять другую логику, возвращаясь к вашим вычислениям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...