はロックが不要になマルチスレッドはPythonコードからギル?
-
01-07-2019 - |
質問
ご依存の実装Pythonを持つグローバルロックの通訳(つまりCPython)書き下記からダウンロードコードで、必要な情報であるロックは全くないのでしょうか。
場合にはGILない複数の指示を実行する並列にな共有データを不要とされる。
申し訳の場合は、ダム問題ではないといけないと思っていい"とPythonのマルチプロセッサコアます。
同じものが適用されることとなるその他の言語の実装ではGIL.
解決
まだロックの場シェアの状態の間のスレッド)。のGILを守るだけではなく、通訳を内蔵しています。まだまだ反アップデートがご自身のコードです。
例えば:
#!/usr/bin/env python
import threading
shared_balance = 0
class Deposit(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance += 100
shared_balance = balance
class Withdraw(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance -= 100
shared_balance = balance
threads = [Deposit(), Withdraw()]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print shared_balance
ここでは、コードが中断することとの間の共有状態(balance = shared_balance
や書の変更は結果に戻shared_balance = balance
)が失われます。その結果、ランダムな値を共有します。
の更新は、一貫した実行方法る必要があるロックの共有状態の読み取りの変更-書き込み部の内部ループ)または 一方を検出するための共有状態が変わったから読み.
他のヒント
なにGILで保護pythonの内部からの複数のスレッドを変える。これは非常に低いレベルのロックだけでは不十分で守python自体の構造を一貫した。でを網羅していませんの の応用 レベルロックだいた時には、スレッドの安全性に自分のコードです。
の本質を固定するため、特定の ブロック のコードが実行される。のGIL実施を行うこのブロックのサイズのシングルbytecodeが、通常はそのままにしてロックをスパンの大きなブロックをコードします。
を加え、ディスカッション:
ではGILが存在し、一部の業務は原子Pythonではないが必要なロックが解除されます。
http://www.python.org/doc/faq/library/#what-kinds-of-global-value-mutation-are-thread-safe
はその他の答えします まだ を利用する必要がロックする毎にアプリケーションロジックを必要としなどのプロデューサー/消費者問題)。
世界の通訳のロックを防ぎのスレッドからアクセス 通訳 同時にこのようにCPythonみ用コア)しかし、私の理解では、スレッドが中断-予定 案, で、まだロック共有データ構造物のねおのスレッドストンプ互いのまったつま先です。
その答えったのはmultithreading Pythonとは、ほとんどのオーバーヘッドです。と聞いたもの PyProcessing プロジェクトは、走る複数のプロセスとして"シンプル"としてmultithreading、共有データ構造のキューなど。(PyProcessingに導入し、標準ライブラリにPython2.6としての マルチプロセ モジュール) この新しくできたの吉は、各プロセスは、独自の通訳です。
このポストに吉ではかなり高レベル:
その中で、特にこれらの引用:
て指示(このデフォルト 変更可能)、コアスリリースの GILのための現在のスレッドその のOSを選択のスレッドから すべてのスレッドを競うロック れの選択と同じスレッド が発売されたばかりのギル–ん て個人などの第三者に提供するスレッド が選ばれた);このスレッドを取得します GIL運行しても十 います。
や
がありますので注意してください、吉み 制限純粋なPythonコードです。拡張子 (外部ライブラリ通常 の文字)を書き込みできる ることでロックを解除できますので、それを可能に Pythonインタプリタを実行 とは別にまで延長 の延長reacquires、ロックが解除されます。
そのようなGILを提供しているにすぎず、これらの少ない可能なインスタンスコンテキストスイッチ、マルチコア-プロセッサシステムとして振る舞うシングルコア、各pythonインタプリタインスタンスであり、ものを使用する必要の同期メカニズム。
この目的:
単一プロセッサーコンピュータmultithreadingが伸一スレッドおよび他の速度でなされる。このようにPythonのギル:唯一のスレッドに実際おりたったことはあります。
このスレッドの取り止めることができ、どこにでも合いを計算するb=(a+b)*3、これを指示して思ったこと。
1 a += b
2 a *= 3
3 b = a
今作とは言いが実行のスレッドがスレッドが停止後のいずれか1または2、そして別のスレッドキックに走る:
b = 5
そして、他のスレッドが再開し、bで上書きされる計算値は、ありませんでした。
がりを見て頂く事が出来るものではありませんが実際に走行を同時においてロックしなければなりません。
ただしを使用する必要がロック(コードが中断することを随時実行が別のスレッドとすることがありますのでデータ矛盾).問題はGILは防いでくれるのではPythonコードをコアと同時に(または複数のプロセッサなります。
ロックが強く求められている。った理由を考えています。
の他の操作命令が実行されます。吉る通訳で開催される単一のスレッド 特定の瞬間の時間.およびプログラムは複数のスレッドの作品が一通訳です。では、特定の瞬間の時間は、通訳が開催される単一のねじになります。このスレッドのみでの通訳 走 任意の瞬間の時間。
いつのスレッドというt1とt2で、たいして実行し指示を読の価値はグローバル変数とincrementingます。
#increment value
global var
read_var = var
var = read_var + 1
と、吉ける二つのスレッドで実行し指示と同時に、両方のスレッドで実行 read_var = var
では、特定の瞬間です。しているのですが実行し指示につき不良が考えられます。この状況:
- 仮read_varは0になります。
- 吉が開催されるスレッドt1.
- t1実行
read_var = var
.なので、read_var、t1は0になります。GILのみことを保証するの読み込みオペレーションを実行しませんその他のスレッドでこれを瞬時に行うことになる。 - 吉されたスレッドt2.
- t2実行
read_var = var
.がread_varは0になります。なので、read_varにt2は0になります。 - 吉はt1.
- t1実行
var = read_var+1
varが1になります。 - 吉はt2.
- t2考えread_var=0ので、その読み出します。
- t2実行
var = read_var+1
varが1になります。 - 期待した
var
必要となる2. - なので、ロックする必要がありまするの両方を読みincrementingとして原子の動作です。
- まHarris'答えを説明してのコード例です。
少しの更新からはハリスの例:
class Withdraw(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
if shared_balance >= 100:
balance = shared_balance
balance -= 100
shared_balance = balance
入り値をチェックの撤退というマイナスとなりの更新らしい。私の質問は
場合はGILを防止で唯一のスレッドで実行できる任意の原子時、その場の陳腐化はどのようなものか?ない場合には無効な値は、なぜ必要がありまロック?を想定しの一つは純粋なpythonコード)
がわかれば、正しくは、上記の条件をチェックな仕事 実 スレッド環境です。同時に複数のスレッドの実行を同時に、無効な価値を創造することができるこの矛盾の共有状態、すなロックが解除されます。なpython本当のみで行えるように、一つだけのスレッドの時間スライスネジ)、その後べきではないのでできる無効な値が存在するのですか。