web-dev-qa-db-ja.com

Python 3.4でのマルチプロセッシングvsマルチスレッドvs asyncio

Python 3.4には、マルチプロセッシング/スレッド用のいくつかの異なるライブラリがあります: マルチプロセッシング vs スレッド vs asyncio =。

しかし、どちらを使用するか、または「推奨される」ものかどうかはわかりません。彼らは同じことをしますか、それとも違いますか?もしそうなら、どれが何のために使われますか?コンピューターでマルチコアを使用するプログラムを作成したい。しかし、私はどのライブラリを学ぶべきかわかりません。

59
user3654650

それらは(わずかに)異なる目的および/または要件を対象としています。 CPython(典型的なメインラインPython実装)はまだ グローバルインタープリターロック を持っているため、マルチスレッドアプリケーション(最近の並列処理を実装する標準的な方法)は最適ではありません。 multiprocessingmaythreadingよりも好まれるのはそのためです。しかし、すべての問題が[ほぼ独立した]断片に効果的に分割されるわけではないため、重いプロセス間での必要性があります。それが、multiprocessingが一般的にthreadingよりも優先されない理由です。

asyncio(この手法はPythonだけでなく、他の言語やフレームワークにもあります。たとえば、 Boost.ASIO )は、多くのI/Oを効果的に処理する方法です並列コード実行の必要がない多数の同時ソースからの操作。したがって、それは一般的な並列処理ではなく、特定のタスクに対する単なるソリューション(確かに良いソリューションです!)です。

48
user3159253

[素早い回答]

TL; DR


正しい選択をする:

最も一般的な形式の並行性について説明しました。しかし、疑問は残ります-いつどれを選ぶべきですか?本当にユースケースに依存します。私の経験(および読書)から、私はこの擬似コードに従う傾向があります:

if io_bound:
    if io_very_slow:
        print("Use Asyncio")
    else:
        print("Use Threads")
else:
    print("Multi Processing")
  • CPUバウンド=>マルチプロセッシング
  • I/Oバウンド、高速I/O、接続数の制限=>マルチスレッド
  • I/Oバウンド、遅いI/O、多くの接続=> Asyncio

参照


[[〜#〜] note [〜#〜]]:

  • 長い呼び出しメソッド(つまり、スリープ時間または遅延I/Oを含むメソッド)がある場合、最良の選択は asyncioTwisted または Tornado アプローチ(コルーチンメソッド)、並行性として単一のスレッドで動作します。
  • asyncioPython3.4以降で動作します。
  • Tornado および Twisted は、Python2.7以降の準備ができています
  • vloop は非常に高速なasyncioイベントループです( vloopasyncioを2〜4倍高速にします)。
31
Benyamin Jafari