2012-03-03 18 views
5

私は、他のスレッドをブロックしているように見える、CPUを大量に処理するスレッドがあります。どのように私はそれを制限するのですか?Pythonスレッドをどのように抑制できますか?

これは特にweb2py用ですが、一般的な解決方法は問題ありません。

+3

スレッドがCPUを集中的に使用することによってブロックされる可能性は低いです。グローバルインタープリタロック(http://wiki.python.org/moin/GlobalInterpreterLock)の問題にぶち当たっている可能性が非常に高いです。状況を把握するために、私たちにいくつかの情報を提供する必要があります。あなたのスレッドは正確に何をしていますか? – Wilduck

+1

@Wilduck CPUを大量に消費するスレッドはIOレイテンシを追加することができます(最近のPythonではそれほどですが)。http://dabeaz.blogspot.com/2010/01/python-gil-visualized.html – Tobu

+0

@WilduckスレッドはJSでコードを実際に呼び出します。私はGILを試してみようと誘惑しています(まだないのであれば)が、JSがGILを必要としていないことを確認するように強制します...私はおそらくそれを瞬間のままにしておきます回避策を見つけることができます。 – Chris

答えて

3

私は実際にはちょうどこの問題に没頭してしまったばかりですが、スレッドの優先度を変更することはできませんが、これを回避する方法があります。

cPython実装のCPUバインドスレッドでは、グローバルインタープリタロックまたはGILのリリースおよび取得方法のために、他のスレッドが枯渇する可能性があります。奇妙なことに、この問題はマルチコア環境で悪化します。この問題に関する実際の詳細な分析とプレゼンテーションはDavid Beazleyによって行われました。これはhttp://www.dabeaz.com/python/GIL.pdfにあります。彼はいくつかのブログ記事を持っています。彼らは長くてもかなり魅力的です。

短いバージョンでは、CPUバインドスレッドがGILを解放して再取得してから、他のスレッドを起動して取得することができます。時間の90%以上にわたってGILを保持しているCPU境界スレッドが発生しました。

この問題を回避するために使用できるパターンがいくつかあります。たとえば、CPUバウンドタスクを全く異なるプロセスで実行できます。これにより、オペレーティングシステムスケジューラはリソース共有をもっとうまく管理できるようになり、オペレーティングシステムが実際にIOバウンドスレッドに優遇措置を取るので、web2pyスレッドを実行し続ける必要があります。この場合、multiprocessingライブラリが提供されています。それはそれを働かせるためにいくつかのより多くのコードを必要としますが、それは助けるべきです。

+0

マルチプロセッシングは可能なオプションのようです、thanks @ William-- – Chris

1

使用しているPythonのバージョンはどれですか? 3.2において、the GIL was changed to yield after fixed timeslices rather than after a certain number of high-level opcodes

CPUを大量に使用しているコードを実行すると、Webアプリケーションの待ち時間に影響を与える可能性があります(逆に、CPUに負荷のかかる部分がコア全体を占有することはありません)。 Beanstalkdのようなキューを使用してワーカープロセスにタスクをスピンオフさせ、OSスケジューラにその作業を任せてください。

+0

私は新しいGILが3.2にしかないと思います。彼らは実際にそれをさらに3.3の改善に取り組んでいます。http://bugs.python.org/issue7946残念ながら、Webフレームワークでのpython 3のサポートは、ちょうど始まったばかりです。私はまだ安定したものは聞いていない。 – William

+0

@ウィリアムありがとう、訂正しました。 [イントレピッドソウルはここにバックポートを見つけるでしょう。](http://bugs.python.org/issue7753) – Tobu

関連する問題