どのようなスレッドの作業にPythonのためには、普通はPythonのスレッディング特有の落とし穴?
-
09-06-2019 - |
質問
ってラップに私の頭の周りにどのようスレッド作Pythonでは、あまり見かけなくなってしまった良い情報をどのようお願いいたします。まだ不足のリンクは何か、ないかなと思い、公式な書類はないの徹底に関しては、なんとができ書き込みます。
だからこそできるように、一つのスレッドで走行時のアクティブスレッドのスイッチ10の指示または"と思いますよね(笑)。
があい説明については、可能です。についても意識する共通の問題を走行することに利用中のスレッドとエラーになります。
解決
ありが世界規模で流通することから通訳をロック(GIL)が単一のスレッドです。ここではいくつかのリンクをもつこ
- http://www.artima.com/weblogs/viewpost.jsp?thread=214235
- http://smoothspan.wordpress.com/2007/09/14/guido-is-right-to-leave-the-gil-in-python-not-for-multicore-but-for-utility-computing/
からのリンクで興味深い引用:
についてご説明いうことです。スレッドの実行中に同じ仮想 機械、そのため、同じ 物理機です。プロセス実行 同じ物理機 別の物理機です。の場合 建築家のお申込の周辺 スレッドだが、何もしなかアクセス 複数の機です。なので、できる規模 多くのコアのシングル 機となるか 時間とともに届ウェブ スケールする必要がありまを解決する 複数機械の問題。
を利用する場合はマルチコア、 pyprocessing を定義しますプロセスのフォローもよろしくお願い本物の並列化.の PEP また面白いベンチマーク
他のヒント
Pythonのかなりやすい言語のスレッドにも留意しなければならない点もあり.最大のもののことを知る必要があり、グローバル通訳-ロックになっています。この一つのスレッドをアクセスは通訳です。これは二つのことをやろうとしてい1)がいまひっそりとたたずをロック決python2を取得しようとする者に対してのマルチプロセッサシステムは、別のプロセス。編集:べるのもまた一部のコードC/C++を取得する場合にGILします。
このように、必要なものを再考してなぜ使用したいスレッド)。したい場合の並列化アプリのデュアルコア-アーキテクチャにより、検討の必要性の破れをアプリには複数のプロセス。
の場合を改善していきたいと思い応答性を使うことを検討すべきスレッド)。ありその他の選択肢が、 microthreading.もありますの枠組みとしておくとよいでしょう:
以下には、基本的なスレッドのサンプル。で産卵20スレッド各スレッドが出力をそのスレッドの番号です。で観察し、その印刷できます。
import threading
class Foo (threading.Thread):
def __init__(self,x):
self.__x = x
threading.Thread.__init__(self)
def run (self):
print str(self.__x)
for x in xrange(20):
Foo(x).start()
している示唆はPythonのスレッドにより実行時にスライス.このように"並列"。
私の例では私Fooのクラスはスレッドとして実施し run
方法であるが、コードのときに実行スレッド。のスレッド呼び出す start()
のスレッドオブジェクトは、自動的にインストールを行 run
法。
もちろん、これは単なものでもあります。いずれについてお知りになりたいセマフォ、ミューテックス、ロックのためのスレッド同期メッセージを生み出していきます。
使用スレッドの場合はpythonの個人労働者とのI/Oに行きます。いう規模で複数のコアマシンのいずれかを探す IPC 枠組みのpythonは異なる言語です。
注意: どこだ thread
だって具体的には pythonのスレッド まで明示的に記載しています。
スレッドの作業が少し異なりますpythonでは多くの場合 C/C++
背景のもの。Pythonでは、唯一のスレッド走行状態ですることができるものとします。このスレッドはpythonできない真の力は複数の処理において優れたコによるデザインできないためにスレッドに平行に走る複数のコアを用いた
としてメモリ管理pythonはスレッドセーフではありません各スレッドを必要とする専用のアクセスデータ構造にpythonインタプリタこの専用のアクセスにより取得したメカニズム GIL
(グローバルinterpretrロック).
Why does python use GIL?
を防止するため、複数のスレッドからアクセス通訳の状態を同時にcorruptingの通訳。
のときのスレッドが実行される るとともに、メインスレッド), は、ギル分取得し、その後所定の時間間隔の 吉は現在のスレッドにより、jisによる他のスレッドを含みます。
Why not simply remove GIL?
ではないことなGILかるprcoessのないそのものをほど複数のロック内での通訳をするためserializeアクセスもに単一のネジ付きケ少performant.
そのコストを削除GILで対数の減少による性能の単一のネジ付きアプリケーションは決して望ましい。
So when does thread switching occurs in python?
スレッドのスイッチが吉です。それではGIL公表されていますか?あのシナリオを考慮する。
場合、スレッドがCPU行業務(Ex画像処理).
古いバージョンのpythonのスレッド切り替えを使用後に発生する固定なのpythonください。またデフォルトの設定 100
.でっているのに対しては非常に良い政策決定切り替え時に発生時以降の時間を実行する単一の指導でき
非常に気からのミリ秒のものです。このため放GIL毎 100
指示を問わず時間から実は貧しい。
新しいバージョンを使わず、指数としてのメトリックをスイッチスレッドは、設定可能時間間隔を使用します。デフォルトのスイッチ間隔が5ミリ秒です。を得ることができ電流スイッチ間隔を使用 sys.getswitchinterval()
.これを変更することができ用 sys.setswitchinterval()
場合、スレッドがっIO行業務(Exファイルシステムのアクセス
ネットワークIO)
吉が放つスレッドが待って一部IO操作を完了します。
Which thread to switch to next?
の通訳なしを提供します。スレッドが末の予定の間隔はosのファイルはありません.
一つ簡単な解決策をGILの マルチプロセ モジュールです。て用いることができ名をjavaでの名前に変換し、スレッドモジュールが複数の通訳のプロセスです。このことがありませんが、より架よ平野のスレッドのための簡単なものができる利点の並列化が必要な場合です。でも簡単にスケールに複数の物理機です。
が必要な場合は誠に大きな規模並列化していたように更なるただし、そのままスケーリングしたいすべてのコアコンピュータまたは複数の異なるものをなくすべての仕事が入ってしまったらしい.ライフの実施により包括的な枠組みで、これはあなたのためです。
していることを忘れないでGILック周辺のくするためこのセクションの外観の複数の事ができます。この設定ができるの微調整もお得な素泊まりプランを提案できれいー(はなびがきれいーでも仕事のスレッドがうまくコンテキストのスイッチをすること。
こうと思いなが複数に対する親プロセッサーという仕事は、同じコア(s)です。