マルチスレッド
ゲンロック(ミューテックス)
この問題を解決しますか?
ゲンロックは、問題を解決しますか?
あるスレッドが、戻ってデータを操作するのに十分な時間ではなくデータを取得するため、複数のスレッドが同じデータを操作、データ障害の問題は、別のスレッドを実行することが可能となる、CPUを発生することがあり、別のスレッドが取得することです次のようにスレッド前のデータは、処理されません
import threading
import time
count=20
def zx():
global count
print(count)
time.sleep(0.001)
count-=1
t_list=[]
for t in range(20):
t=threading.Thread(target=zx)
t_list.append(t)
t.start()
for i in t_list:
i.join()
print(count)
20
20
20
20
20
20
18
18
18
15
15
15
13
11
11
8
8
8
6
6
0
ソリューション
あなたは、コードの一部を実行した後、あなたが他のスレッドがしたい正確なデータを得ることを保証することができますが、この部分はシリアルですので、あなたは、他のスレッドを呼び出すために、CPUを強制することができます。
具体的な実装プロセス
A. 100スレッドはGILロックを盗もうと、そのグラブは、実行権限を
II。 )がありGILを(時間のために、スレッド1と呼ばれている)つかむためのスレッドも、実行を開始し、一度実行(lock.acquireを取得する必要があります
III。ほとんどのGILをつかむために、別のスレッドがあるスレッド1、2を実行が終了した後、実行するために始めたが、実行権限を放棄することを余儀なく、ミューテックスロックスレッド2スレッド1がまだブロックされ、その後、解除されていないことが判明していませんそのリリースGIL
IV。スレッド1まで再びGILをつかんで、実行は、他のスレッド、通常の解放ミューテックスロックするまで、最後の休止位置から継続して処理234を繰り返します
import threading
import time
count=20
lock=threading.Lock()
def zx():
global count
lock.acquire()
print(count)
time.sleep(0.001)
count-=1
lock.release()
t_list=[]
for t in range(20):
t=threading.Thread(target=zx)
t_list.append(t)
t.start()
for i in t_list:
i.join()
print(count)
20
19
18
17
16
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
デッドロック
いわゆるデッドロックは:実装プロセス内の2つの以上のプロセスまたはスレッドの現象をいう、外力が存在しない場合に、お互いを待っによって引き起こされるリソースの競合の結果は、彼らがそれを促進することができません。このとき、次のようにデッドロックがあると、システムがデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するために、デッドロック状態またはシステムであると言います
例えば、2件のスレッドがありますが、スレッド1がロックを得たが、彼は唯一のロックAを解放するためにBキーを持って、ロックBのスレッド2は、彼はこれら二つのスレッドの結果、Bを解放するためにロックするためのロックを持ってしまいました死にました
import threading
import time
class MyThreading(threading.Thread):
def run(self):
self.run1()
self.run2()
def run1(self):
A.acquire()
print(self.name+"拿到了锁A")
B.acquire()
print(self.name+"拿到了锁B")
B.release()
print(self.name+"释放了锁B")
A.release()
print(self.name+"释放了锁A")
def run2(self):
B.acquire()
print(self.name+"拿到了锁B")
time.sleep(2)
A.acquire()
print(self.name+"拿到了锁A")
A.release()
print(self.name+"释放了锁A")
B.release()
print(self.name+"释放了锁B")
if __name__ == '__main__':
A=threading.Lock()
B=threading.Lock()
for t in range(5):
t=MyThreading()
t.start()
スレッド1がロックを取得する
ロックBを取得するために、スレッド1
スレッド1リリースロックBが
スレッド1ロック解除
スレッド1がBのロックを取得するために
ロックを取得するために、スレッドA-2
デッドロックを解決する方法
再帰的ロック
再帰的ロック
ロックやスレッドを取得するための他の方法であるために、このブロックは、すべてのロックが解除され、全体として見たロックの多いコードのブロック、に相当
原理はロック、+1または-1のロック再帰的な参照カウントが参照カウントが0であるとき、ロック解除、非常に単純な再帰的なロック、である、他のスレッドをロックしたりする方法を得ることができます。
import threading
import time
class MyThreading(threading.Thread):
def run(self):
self.run1()
self.run2()
def run1(self):
D.acquire()
print(self.name+"D==1")
D.acquire()
print(self.name+"D==2")
D.release()
print(self.name+"D==1")
D.release()
print(self.name+"D==0")
def run2(self):
D.acquire()
print(self.name+"D==1")
time.sleep(2)
D.acquire()
print(self.name+"D==2")
D.release()
print(self.name+"D==1")
D.release()
print(self.name+"D==0")
if __name__ == '__main__':
D=threading.RLock()
for t in range(5):
t=MyThreading()
t.start()
这里的==被转义的、将就着看
スレッド1D == 1
スレッド1D == 2
スレッド1D == 1
スレッド1D == 0
スレッド1D == 1
スレッド1D == 2
スレッド-1D == 1
スレッド1D == 0
スレッド2D == 1
スレッド2D == 2
スレッド2D == 1
スレッド2D == 0
スレッド2D == 1
スレッド2D == 2
スレッド2D == 1
スレッド2D == 0
スレッド4D == 1
スレッド4D == 2
スレッド4D == 1
スレッド4D == 0
スレッド4D == 1
スレッド4D == 2
スレッド4D == 1
スレッド4D == 0
スレッド3D == 1
スレッド3D == 2
スレッド3D == 1
スレッド3D == 0
スレッド5D == 1
スレッド5D == 2
スレッド5D == 1
スレッド-5D == 0
スレッド-5D == 1
スレッド-5D == 2
スレッド-5D == 1
スレッド5D == 0
スレッド3D == 1
スレッド3D == 2
スレッド3D == 1
スレッド3D == 0