web-dev-qa-db-ja.com

pythonスレッドのスケジューリング優先順位を制御しますか?

それぞれ10スレッドの2つのスレッドプールを使用してAPIからデータを取得するスクリプトを作成しました。スレッドプールは ActiveStateのこのコード を実装します。各スレッドプールは、新しいエントリの PubSub を介してRedisデータベースを監視しています。新しいエントリが公開されると、pythonは、Pythonの Subprocess.POpen を使用してPHPシェルを実行し、APIを呼び出す実際の作業を行う関数にデータを渡します。

PHPシェルを起動するこのシステムは、私のPHP Webアプリでの機能に必要であるため、PHPでPythonシェルを起動することは避けられません。

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

アプリケーションのスレッドの niceness (スケジューリング優先度)をどのように制御しますか?

編集:

Pythonで個々のスレッドのスケジューリング優先度を制御することは不可能のようです。優先度を制御するためのpythonソリューション、または少なくともスクリプトと一緒に実行できるUNIXコマンドはありますか?

編集2:

まあ、それを処理するためのpython方法を見つけてしまったわけではありません。次のように、Niceでスクリプトを実行しています。

Nice -n 19 python MyScript.py
23
backus

pythonでは、スレッドの優先度はグローバルインタープリターロック(GIL)を使用して実装されているため、制御できません。1つのスレッドにより多くのCPU処理の優先度を与えることができたとしても、 python GILを引き渡す実装は、GILを引き渡すため、これを認識しません。プール内の単一スレッドでnicenessを増やすことができた場合(たとえば、より重要な仕事)より高い優先度のスレッドがGILに頻繁にアクセスできるようにするには、独自のロックの実装を使用する必要があります。

グーグル検索はあなたが尋ねているものに類似していると私は信じているこの記事を返します

機能しない理由について説明します http://www.velocityreviews.com/forums/t329441-threading-priority.html

私が提案していた回避策について説明します http://bytes.com/topic/python/answers/645966-setting-thread-priorities

17
Paul Seeb

かなりの時間が経過しましたが、最近この質問に出会ったので、別のオプションを追加すると便利だと思いました。

threading2 を見てください。これは、デフォルトdrop-in置換および拡張です。 threadingモジュール、サポート–並べ替え–priorityおよび親和性。

3
Luca Lenardi

別の関連する質問でのこの回答 がこのシナリオで役立つかどうか疑問に思っていましたか? ( リンク

すでに Subprocess.POpen を使用してPHPスクリプトを起動しているので、 "preexec_fn"と事前定義された関数またはラムダ関数のいずれかを使用できることに気が付きます(上記のリンクされた回答に示されているように)起動されたそれぞれのニースレベルを設定するPHPスレッド?

1
Spam Hater

それは動作しませんが、私は試しました:

  1. 親のpidと優先度を取得する
  2. concurrent.futures.ThreadPoolExecutorを使用してスレッドを起動する
  3. ctypesを使用して、スレッド内から(linux)スレッドIDを取得します(機能)
  4. os.setpriority(os.PRIO_PROCESS、tid、parent_priority + 1)でのTIDの使用
  5. 親からpool.shutdown()を呼び出します。

Os.sched_yield()が自由に散在している場合でも、子スレッドが実際にsetpriority()を通過することはありません。

マニュアルページを読んでいると、スレッドにはスケジューリングの優先順位を(たとえそれらにさえ)変更する機能がないようです。スレッドに「CAP_SYS_Nice」機能を与えるには、「機能」を使用して何かを行う必要があります。 root権限でプロセスを実行しても効果はありませんでした。子スレッドはまだ実行されません。

1
Andrew Wagner

python threading-docs は、スレッドの優先順位の設定はサポートされていないことを明記しています:

このモジュールの設計は、大まかにJavaのスレッドモデルに基づいています。ただし、Javaは、すべてのオブジェクトの基本的な動作であるロックと条件変数を作成しますが、Pythonでは個別のオブジェクトです。PythonのThreadクラスは、JavaのThreadクラスの動作のサブセットをサポートしています。現在、優先順位はなく、スレッドグループはなく、スレッドを破棄、停止、一時停止、再開、または中断することはできません。JavaのThreadクラスの静的メソッドは、実装されると、モジュールレベルの関数にマップされます。

0
Darkonaut