2012-10-20 12 views
17

Issue 6721に関して、Linuxの同じPythonアプリケーションでマルチスレッドとユーザースレッドの両方を使用するためのベストプラクティスまたは回避策はありますか?python標準ライブラリのロックはforkでサニタイズする必要がありますか?Pythonでのマルチプロセッシングとスレッド化の状況

なぜ私は両方が必要ですか?子プロセスを使用して計算量を増やすと、キューを返すには大きすぎるデータ構造の結果が生成され、すぐにディスクに格納する必要があります。これらの子プロセスのそれぞれを独立したスレッドで監視することは効率的であるように見えました。その結果、スレッドは大規模な(例えば複数の)GBデータを読み込むIOを処理して、他の子プロセスの結果との組み合わせ。 子プロセスが断続的にハングアップすることがありました。他の人がここでの問題を文書化しています

https://twiki.cern.ch/twiki/bin/view/Main/PythonLoggingThreadingMultiprocessingIntermixedStudy

この明らかに未解決のpythonの問題を指している:Pythonの標準ライブラリのロック、フォークの上に消毒する必要があります。私はこれを追跡していた難易度でアラーム発生http://bugs.python.org/issue6721

は、私は答えた:むしろ役に立たない「ように注意してください」に提案し、上記へのリンクを

Are there any reasons not to mix Multiprocessing and Threading module in Python

を。

しかし、長い議論では、問題6721は、同じアプリケーションでマルチプロセッシング(またはos.fork)とユーザースレッドの両方を使用することが「バグ」であることを示唆しています。私の問題を限定的に理解した上で、同じアプリケーションでマルチプロセッシングとスレッディングの両方を使用するための回避策や戦略については、ディスカッションであまりにも多くの意見の相違があります。私の即時の問題はロギングを無効にすることで解決されましたが、私は親プロセスと子プロセスの両方で少数の他の(明示的な)ロックを作成し、さらに断続的なデッドロックが発生する可能性があると思います。

Python(2.7,3.2,3.3)アプリケーションでスレッディングとマルチプロセッシングを使用しているときにロックやロギングモジュールを使用しているときにデッドロックを回避するための推奨事項はありますか?

+2

興味深いのは、 'multiprocessing'モジュールが既に(ロックタイプを含む)いくつかのフォークを意識したタイプを作成するために内部' treading'モジュールを使用することです。 'util.py'を参照してください。これらの型は 'manager.py'の' BaseProxy'クラスで使われます。 –

答えて

2

プログラムにスレッドが1つしかない場合(つまり、メインスレッドからフォークしてワーカースレッドを生成する前に)、追加のプロセスをフォークオフすると安全です。

あなたのユースケースは、マルチプロセッシングモジュールを必要としないようです。サブプロセス(またはより簡単なos.systemのような呼び出し)を使用することができます。

も参照してくださいIs it safe to fork from within a thread?

+2

[この回答](http://stackoverflow.com/a/6079669/4279)は、特に有用な以前の投稿、 – jfs

+0

の質問に関係しています。私はマルチプロセッシングモジュールは必要ないと理解していますが、私が使用するキューを提供しています(最終的な結果ではありません)。 – ricopan

+0

Re:1つのスレッドでフォークする。いいアドバイス。ここでは未知の依存関係グラフをたどっていますので少し難解ですが、リクエストキューを監視して新しいプロセスを開始する別のプロセスでサーバーを作成するために早期にフォークします。これは、私が継承状態を管理しているスタンドアローンアプリケーションで動作しますが、ライブラリとして、私はその状態に対処しなければなりません。 – ricopan

関連する問題