私はこの新しい実装について検索していましたが、Python 2.7を使用しています。これをインストールする必要があるため、これを使用すると、CPythonのGILという単語を忘れてしまいますか?
1 に答える
いいえ、concurrent.futures
GILとはほとんど関係ありません。
スレッドの代わりにプロセスを使用することは、GILの薬です。(もちろん、すべての薬と同様に、副作用があります。しかし、それは機能します。)
このモジュールは、直接futures
使用するよりも簡単にタスクをスケジュールして待機する方法を提供します。また、コードを変更せずに、スレッドプールとプロセスプール(さらにはグリーンレットループ、またはあなたが発明して構築したクレイジーなもの)を交換できるという追加の利点があります。したがって、コードにGILの問題があるかどうかわからない場合は、スレッドを使用するようにコードをビルドしてから、1行の変更でプロセスを使用するように切り替えることができます。これは非常に便利です。threading
multiprocessing
future
ただし、を使用すると、とを使用して手動でスレッドプールやThreadPoolExecutor
タスクキューなどを作成した場合とまったく同じGILの問題が発生します。を使用すると、手動で使用した場合と同じ方法で(そして同じトレードオフで)GILの問題を回避できます。threading
queue
ProcessPoolExecutor
multiprocessing
concurrent.futures
また、PyPIパッケージは、3.2から2.x(および3.0-3.1)へのモジュールの単純なバックポートです。(これは、魔法のように改良された3.2 GIL、またはさらに改良された3.3 GILを提供するものではなく、GILを削除することはほとんどありません。)
GILの変更については、混乱を招いたように思われるので、おそらく言及するべきではありませんでした…しかし、今度は、ひどく単純化しすぎて、GILをまっすぐにしようと思います。
IOバウンドの作業しかない場合、スレッドは、妥当な制限まで、並行性を取得するための優れた方法です。そして、3.3はそれらをさらに良く機能させますが、ほとんどの場合、2.7はすでに十分であり、そうでないほとんどの場合、3.3はまだ十分ではありません。10000の同時クライアントを処理する場合は、スレッドの代わりにイベントループ(たとえば、、、、など)を使用する必要がありますtwisted
。tornado
gevent
tulip
CPUにバインドされた作業がある場合、スレッドはその作業を並列化するのにまったく役立ちません。実際、彼らは事態を悪化させます。3.3では、そのペナルティはそれほど悪くはありませんが、それでもペナルティであり、これを行うべきではありません。CPU作業を並列化する場合は、スレッドではなくプロセスを使用する必要があります。3.3の唯一の利点はfutures
、よりも少し使いやすく、multiprocessing
インストールする代わりに組み込みで提供されることです。
3.3は、2.7よりも優れた言語のより優れた実装であるため、3.3への移行を思いとどまらせたくありません。しかし、より良い並行性は移動する理由ではありません。