← Retour aux recettes

Exécuter des processus parallèles

Créer des éléments de file et démarrer un pool de processus qui les traite dans des onglets navigateur parallèles.

Files et processus Intermédiaire JavaScript parallel_workers.js

Prérequis

  • Un espace de travail Guida ouvert
  • Un script de processus enregistré dans scripts/check-site.js

Résultat attendu

Guida met des vérifications de sites en file et démarre un pool avec deux onglets navigateur concurrents.

Exemple source

parallel_workers.js

Les processus permettent à Guida de traiter des éléments de file en parallèle. Chaque processus reçoit son propre onglet navigateur et son contexte d’élément de file.

// Parallel Workers — Process queue items concurrently
//
// Workers run queue items in parallel, each in its own
// browser tab. This script sets up a worker pool that
// processes a queue with multiple tabs side by side.
// Requires an open workspace.
const queueName = "sites_to_check";
// First, enqueue some work items
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("Enqueued " + sites.length + " sites");
// Start a worker pool with 2 concurrent tabs
// Each worker runs 'scripts/check-site.js' per item
g.workers.start({
clearTabs: true,
layout: "vertical",
workers: [{
queue: queueName,
script: "scripts/check-site.js",
concurrency: 2,
throttle: {
requestsPerMinute: 30
}
}]
});
g.log("Worker pool started! Watch the Task Manager pane.");
g.log("Workers will process items independently.");
g.log("Use g.workers.status() to check progress.");
g.log("Use g.workers.stop() to stop the pool.");
// ---- In scripts/check-site.js you would write: ----
//
// // Get the worker context (assigned tab + queue item)
// const ctx = g.worker.getContext();
// const tabOpts = { browserTabId: ctx.tabId };
//
// // Navigate in the worker's own tab
// await g.nav.navigateToUrl(ctx.item.data.url, tabOpts);
//
// // Extract data from the page
// const title = await g.page.executeJS("document.title", tabOpts);
//
// // Save result to the store
// g.store.put("site_checks", ctx.item.data.name, {
// title: title,
// url: ctx.item.data.url,
// checkedAt: new Date().toISOString()
// });
//
// // Commit to remove item from queue (required!)
// g.queue.commit(ctx.item.id);