2013-02-20 10 views
5

私はちょうどこの新しい実装について探していました。私はPython 2.7を使用しています。thisをインストールする必要があります。使用すると、CPythonのGILという単語は忘れられますか?同時治療薬はGILの薬ですか?

+1

http://www.dalkescientific.com/writings/diary/archive/2012/01/19/concurrent.futures.html –

+1

http://docs.python.org/dev/library/concurrent.futures.html #module-concurrent.futures - GILについて何も言及していないので、使用するスレッドは明らかに真のスレッドです。さもなければ、なぜこのすべてのhulabalooを気にしますか? –

+0

私は、非同期コードがconcurrent.futuresの使用が大好きであることを発見したので、GILのメディシンだと言いました。 –

答えて

12

いいえ、concurrent.futuresは、GILとはまったく関係ありません。

スレッドの代わりにプロセスを使用すると、GILの薬です。 (もちろん、すべての薬のように、それは副作用を持っている。しかし、それは動作します。)

futuresモジュールは、ちょうどあなたのスケジュールと直接threadingまたはmultiprocessingを使用するよりも作業に待つ簡単な方法を提供します。 futureコードを変更せずに、スレッドプールとプロセスプール(そしておそらくグリーンレットループ、あるいはあなたが発明してビルドしたもの)を入れ替えることができるという利点があります。したがって、コードにGILの問題があるかどうかわからない場合は、スレッドを使用するようにコードを構築してから、1行の変更でプロセスを使用するように切り替えることができます。

しかし、あなたは ThreadPoolExecutorを使用する場合は、手動で threadingqueueでスレッドプール、タスクキューなどを作成したかのように、それはまったく同じGILの問題を持っています。 ProcessPoolExecutorを使用する場合は、 multiprocessingを手動で使用した場合と同じ方法で(同じトレードオフで)GILの問題を回避します。

PyPIパッケージは、concurrent.futuresモジュールの3.2から2.x(および3.0-3.1)の単純なバックポートにすぎません。 (それは魔法のようにあなたに新しい-およびソート・オブ・改善3.2 GILを与える、またはそれ以上-改善3.3 GIL、はるかに少ないGILは削除されません。)


私はおそらく持つべきではありませんGILが変わったと言いました。これはちょうど混乱を招いてしまったようですが...今は、ひどく単純化することによって、まっすぐにしてみましょう。

IOバインドされた作業以外何もしていない場合、スレッドは並行性を得るのに最適な方法です。そして3.3はそれらをより良く動作させますが、ほとんどの場合、2.7は既に十分です。ほとんどの場合、そうでない場合は3.3で十分ではありません。 10000の同時クライアントを処理する場合は、スレッドの代わりにイベントループ(たとえば、twistedtornadogeventtulipなど)を使用する必要があります。

CPUバインドされた作業がある場合、スレッドはその作業をまったく並列化するのに役立ちません。実際、彼らは事態を悪化させます。 3.3はそのペナルティをそれほど悪くしないが、それはまだペナルティであり、あなたはまだこれを行うべきではない。 CPU作業を並列化する場合は、スレッドではなくプロセスを使用する必要があります。 3.3の唯一の利点は、futuresmultiprocessingより少し使いやすく、それをインストールする必要がなく内蔵されていることです。

2.7よりも優れた言語を実装しているため、3.3への移行をお勧めしません。しかし、より良い並行性は動かす理由ではありません。

+0

彼らは違うものです!それはGILが3.2に書かれていたので、私はそれが同時であるようです。問題を解決する未来、ありがとうございます。 –

+2

@AbdelouahabPp:いいえ、 'concurrent.futures'は問題を解決しません。並行コードはやや簡単に書くことができます。 3.2と3.3のGILへの変更は完全に独立しており、10年以上にわたる最初の重要なGILの変更が 'futures'ライブラリと同じバージョンのPythonに到着したのは偶然のことです。 – abarnert

+0

したがって、優れた同時コードを取得したい場合は、3.3に切り替える必要があります。ありがとうございました:)そしてこのスレッドは私がそれ以上のアイデアを得るためにサーバーの時間に戻ってきますので、ごめんなさい。初心者であり、このライブラリを竜巻で見つけました。 –