2012-07-10 23 views
13

APIからデータを取り込むために、それぞれ10個のスレッドからなる2つのスレッドプールを使用するスクリプトを作成しました。スレッドプールはthis code on ActiveStateを実装します。各スレッドプールは、新しいエントリのためにを介してRedisデータベースを監視しています。新しいエントリが公開されると、PythonはそのデータをPythonのSubprocess.POpenを使ってPHPシェルを実行してAPIを呼び出す実際の作業を行う関数に渡します。Pythonスレッドのスケジューリング優先順位の制御?

PHPシェルを起動するこのシステムは、PHP Webアプリケーションで機能するために必要です。したがって、PythonでPHPシェルを起動することは避けられません。

このスクリプトはLinuxサーバーでのみ実行されます。

アプリケーションのスレッドのniceness(スケジューリングの優先順位)を制御するにはどうすればよいですか。

編集:

それはPythonで、個々のスレッドのスケジューリング優先順位を制御するらしいことはできません。 Pythonの解決法はありますか、少なくとも私のスクリプトと一緒に実行して優先度を制御することができるUNIXコマンドですか?

編集2:

まあ、私はそれを処理するためのpythonの方法を見つけるまで終わりませんでした。私はこのようになりました素敵で私のスクリプトを実行している:

nice -n 19 python MyScript.py 

答えて

11

私はスレッドの優先順位が原因彼らはグローバルインタプリタロック(GIL)を使用して実装されている方法にPythonで制御可能ではないと信じています。たとえあなたが1つのスレッドにCPU処理優先度を与えることができたとしても、GILを手渡すPythonの実装は、GILを渡しているときにこれを認識しません。プール内の1つのスレッドでニッチを増やすことができれば(より重要な仕事をしている)、GILへのより高いプライオリティのスレッドアクセスをより頻繁に行うために、独自のロック実装を使用する必要があります。

Google検索に戻り、私はあなたが

それは http://www.velocityreviews.com/forums/t329441-threading-priority.html

は私が思っていた私は http://bytes.com/topic/python/answers/645966-setting-thread-priorities

+0

ありがとうございます!私は今、個人の代わりに全体としてアプリケーションのスケジュール優先順位をどのように設定できるかを尋ねる質問を言い換えました。それでも私のニーズを満たすはずです。私はあなたの応答をupvotedし、私は他の応答を取得しない場合は最高の答えとしてあなたを選択します。 – Backus

1

を示唆した回避策について説明して仕事doesntの理由を説明を求めているものと同様であると考えて、この記事this answer at another related questionがこのシナリオでは役に立ちますか? (linkは)

すでにあなたのPHPスクリプトを起動するSubprocess.POpenを使用しているとして、それはあなたが「preexec_fnに」と事前に定義された機能のいずれか、または(上記のリンクの回答で示したように)ラムダ関数を使用できることを私を打ちます起動された各PHPスレッドのniceレベルを設定するには?

2

私は知っています、多くの時間が経過しましたが、最近この質問に出くわしました。私は別のオプションを追加すると便利だと思っていました。優先との親和性のために - の並べ替え -

ドロップインサポートで、モジュールをデフォルトのスレッドため交換や拡張である、threading2を見てください。

関連する問題