2017-03-11 17 views
2

セレンを使ったPythonでの並列実行については混乱しています。それについてはいくつかの方法があるようですが、いくつかのものは時代遅れのようです。セレンを使ったPython並列実行

セレンを使用して並列実行する最新の方法は何ですか?

python-wd-parallelという名前のPythonモジュールがありますが、これはいくつかの機能を備えているようですが、2013年以降はこれがまだ有効ですか?

https://saucelabs.com/blog/parallel-testing-with-python-and-selenium-on-sauce-online-workshop-recap

私たちはconcurrent.futureも持っていますが、これはもっと新しいですが、実装が簡単ではないようです。誰もがセレンで並列実行の実例を持っていますか?

スレッドを実行してエグゼキュータを使用してジョブを完了させることもできますが、すべてのコアを使用していないため、シリアル形成で実行されているため、これは遅くなると感じています。

答えて

1

これを行うには、joblib's Parallelモジュールを使用します。これは、並列実行のための素晴らしいライブラリです。

我々はurlsという名前のURLのリストを持っており、私たちはまず今取る関数を定義することができ、必要なライブラリ

from selenium import webdriver 
from joblib import Parallel, delayed 

をインポートすることができますパラレル

に各1のスクリーンショットを撮りたいとしましょうあなたがどうなるのか並行してそれを実行するためにbase64などのスクリーンショット

def take_screenshot(url): 
    phantom = webdriver.PhantomJS('/path/to/phantomjs') 
    phantom.get(url) 
    screenshot = phantom.get_screenshot_as_base64() 
    phantom.close() 

    return screenshot 

です
screenshots = Parallel(n_jobs=-1)(delayed(take_screenshot)(url) for url in urls) 

この行の実行が終了すると、実行されたすべてのプロセスのすべてのデータがscreenshotsになります。パラレル

  • Parallel(n_jobs=-1)手段について

    説明では、君はパラレル

上で実行しようとしている関数の入力を作成する方法joblib
  • delayed(function)(input)であることができたすべてのリソースを使用します

    詳細については、joblib文書

    をご覧ください。
  • +0

    すべての反復で閉じて開くのではなく、1つのn_jobsに対して1つのwebdriver.PhantomJSインスタンスを再利用する簡単な方法はありますか? – sudonym

    +1

    なぜそれをしたいですか?複数のプロセスから1つのWebdriverインスタンスにアクセスしようとするのは悪い考えです。並列化を傷つけると思います。とにかくそれを続行することに決めたら、webdriverをシリアル化可能にする必要があります – bluesummers

    +0

    多くのありがとう。私の合理的なのは、 "セレンの高速化"という項目では、 "reuse driver instances"という項目がかなり上にあるので、プロセスごとに1つのドライバインスタンス(複数のプロセスに対して1つのドライバインスタンスではない)を持つことでした。 – sudonym

    関連する問題