← Volver a recetas

Ejecutar procesos de trabajo en paralelo

Crea elementos de cola e inicia un grupo de procesos de trabajo que los procesa en pestañas de navegador paralelas.

Colas y procesos de trabajo Intermedio JavaScript parallel_workers.js

Requisitos previos

  • Un espacio de trabajo de Guida abierto
  • Un script de proceso de trabajo guardado en scripts/check-site.js

Resultado esperado

Guida encola comprobaciones de sitios e inicia un grupo de procesos de trabajo con dos pestañas de navegador concurrentes.

Ejemplo de código fuente

parallel_workers.js

Los procesos de trabajo permiten que Guida procese elementos de cola de forma concurrente. Cada proceso de trabajo recibe su propia pestaña de navegador y su propio contexto de elemento de cola.

// Procesos de trabajo paralelos - Procesar elementos de cola de forma concurrente
//
// Los procesos de trabajo ejecutan elementos de cola en paralelo,
// cada uno en su propia pestana de navegador. Este script configura
// un grupo de procesos de trabajo que procesa una cola con varias
// pestanas en paralelo.
// Requiere un espacio de trabajo abierto.
const queueName = "sites_to_check";
// Primero, encolar algunos elementos de trabajo
const sites = [
{ url: "https://example.com", name: "Example" },
{ url: "https://httpbin.org", name: "HTTPBin" },
{ url: "https://jsonplaceholder.typicode.com", name: "JSONPlaceholder" }
];
for (const site of sites) {
g.queue.enqueue(queueName, site);
}
g.log("Encolados " + sites.length + " sitios");
// Iniciar un grupo de procesos de trabajo con 2 pestanas concurrentes
// Cada proceso ejecuta 'scripts/check-site.js' por elemento
g.workers.start({
clearTabs: true,
layout: "vertical",
workers: [{
queue: queueName,
script: "scripts/check-site.js",
concurrency: 2,
throttle: {
requestsPerMinute: 30
}
}]
});
g.log("Grupo de procesos de trabajo iniciado. Observe el panel Task Manager.");
g.log("Los procesos de trabajo procesaran elementos de forma independiente.");
g.log("Use g.workers.status() para comprobar el progreso.");
g.log("Use g.workers.stop() para detener el grupo.");
// ---- En scripts/check-site.js escribiria: ----
//
// // Obtener el contexto del proceso de trabajo (pestana asignada + elemento de cola)
// const ctx = g.worker.getContext();
// const tabOpts = { browserTabId: ctx.tabId };
//
// // Navegar en la pestana propia del proceso de trabajo
// await g.nav.navigateToUrl(ctx.item.data.url, tabOpts);
//
// // Extraer datos de la pagina
// const title = await g.page.executeJS("document.title", tabOpts);
//
// // Guardar resultado en el almacen
// g.store.put("site_checks", ctx.item.data.name, {
// title: title,
// url: ctx.item.data.url,
// checkedAt: new Date().toISOString()
// });
//
// // Confirmar para eliminar el elemento de la cola (obligatorio)
// g.queue.commit(ctx.item.id);