Puppeteerの複数のインスタンスを同時に実行することは安全ですか?
node screenshot.js
_を同時に)またはpuppeteer.launch()
を同時に)?並列プロセスの推奨設定/制限は何ですか?
(私のテストでは、(1)は正常に動作するようですが、PuppeteerとChromeの単一(?)インスタンスとの対話の信頼性について疑問に思っています。まだ試していません(2)がうまくいく可能性は低いようです。)
複数のブラウザ、コンテキスト、またはページを並行して実行しても問題ありません。制限は、ネットワーク/ディスク/メモリとタスクの設定によって異なります。
私は数百万ページをクロールし、時々(私の設定では、すべての 〜10,000ページ )操り人形師がクラッシュします。したがって、ブラウザを自動再起動してジョブを再試行する方法が必要です。
ブラウザインスタンスのプール、再起動、およびクラッシュ検出/再起動を処理する puppteer-cluster をチェックアウトすることをお勧めします。 (免責事項:私は著者です)
クラスターの作成例を以下に示します。
// create a cluster that handles 10 parallel browsers
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_BROWSER,
maxConcurrency: 10,
});
// Queue your jobs (one example)
cluster.queue(async ({ page }) => {
await page.goto('http://www.wikipedia.org');
await page.screenshot({path: 'wikipedia.png'});
});
これは最小限の例です。クラスターを使用する方法は他にもたくさんあります。
各puppeteer.launch()
は、スクリプトが駆動する新しいブラウザーを起動するため、スクリプトが複数のpuppeteer.launch
呼び出しとスクリプトの複数のインスタンスの実行。ノードはシングルスレッドですが、イベントはWebSocketを介してブラウザーに送信されるため、ノードの非同期動作を利用できます。別の言い方をすると、これらのプロセスはいずれもシリアルで実行されず、代わりにシングルスレッドの性質を与えられても並列で実行されます。
背景については、Webベースの作業の生産化を目的としたブラウザレス( https://browserless.io )と呼ばれるサービスを実行しています。ここでdockerにいくつかの画像も保持しています: https://hub.docker.com/r/browserless/chrome/
どちらも機能しますが、2つ目は実際には意味がありません。その理由は、nodeJS iがシングルスレッドであるためです。したがって、プロセスが機能しても、複数のプロセスではなく、1つのプロセスでブラウザの複数のインスタンスを使用する方が速くて簡単ではありません。最良のオプションは、以前と同じように(1)を実行することです。覚えておく必要があるのは、テストを自己完結させることだけです。