← レシピへ戻る

並列ワーカーを実行する

キュー項目を作成し、複数のブラウザータブで並列処理するワーカープールを起動します。

キューとワーカー 中級 JavaScript parallel_workers.js

前提条件

  • 開いている Guida ワークスペース
  • scripts/check-site.js に保存されたワーカースクリプト

期待される結果

Guida がサイト確認項目をキューに入れ、2 つの同時ブラウザータブを持つワーカープールを起動します。

ソース例

parallel_workers.js

ワーカーを使うと、Guida はキュー項目を並列処理できます。各ワーカーは独自のブラウザータブとキュー項目文脈を受け取ります。

// 並列ワーカー - キュー項目を同時処理する
//
// ワーカーはキュー項目を並列に処理し、それぞれが専用の
// ブラウザータブを使います。このスクリプトは、複数タブで
// キューを処理するワーカープールを設定します。
// 開いているワークスペースが必要です。
const queueName = "sites_to_check";
// まず作業項目をキューに入れる
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("サイトをキューに追加しました: " + sites.length + "");
// 2 つの同時タブを持つワーカープールを起動する
// 各ワーカーは項目ごとに 'scripts/check-site.js' を実行する
g.workers.start({
clearTabs: true,
layout: "vertical",
workers: [{
queue: queueName,
script: "scripts/check-site.js",
concurrency: 2,
throttle: {
requestsPerMinute: 30
}
}]
});
g.log("ワーカープールを起動しました。Task Manager ペインを確認してください。");
g.log("ワーカーは項目を独立して処理します。");
g.log("進行状況は g.workers.status() で確認できます。");
g.log("プールを止めるには g.workers.stop() を使います。");
// ---- scripts/check-site.js には次のように書きます: ----
//
// // ワーカー文脈(割り当てられたタブ + キュー項目)を取得する
// const ctx = g.worker.getContext();
// const tabOpts = { browserTabId: ctx.tabId };
//
// // ワーカー専用タブで移動する
// await g.nav.navigateToUrl(ctx.item.data.url, tabOpts);
//
// // ページからデータを抽出する
// const title = await g.page.executeJS("document.title", tabOpts);
//
// // 結果をストアへ保存する
// g.store.put("site_checks", ctx.item.data.name, {
// title: title,
// url: ctx.item.data.url,
// checkedAt: new Date().toISOString()
// });
//
// // 項目をキューから削除するため commit する(必須)
// g.queue.commit(ctx.item.id);