並行プログラミングの理解をデッドロック、再帰的ロックセマフォ
1.デッドロック****
いわゆるデッドロックは:実装プロセス内の2つの以上のプロセスまたはスレッドの現象をいう、外力が存在しない場合に、お互いを待っによって引き起こされるリソースの競合の結果は、彼らがそれを促進することができません。このとき、次のようにデッドロックがあると、システムがデッドロックと呼ばれる別のプロセスを待っているの過程で常にデッドロックを生成するために、デッドロック状態またはシステムであると言います
デッドロック状況:1ペア数回mutexロック
2.他のを待っているルーチン同士のリリースにつながる、また、マルチロックを持っている必要があり、共有リソースにアクセスするには、しかし、ロックが、これらの異なるスレッドやプロセスによって保持されているカードに死亡しました
from threading import Thread,Lock
import time
mutexA=Lock()
mutexB=Lock()
class MyThread(Thread):
def run(self):
self.func1()
self.func2()
def func1(self):
mutexA.acquire()
print('\033[41m%s 拿到A锁\033[0m' %self.name)
mutexB.acquire()
print('\033[42m%s 拿到B锁\033[0m' %self.name)
mutexB.release()
mutexA.release()
def func2(self):
mutexB.acquire()
print('\033[43m%s 拿到B锁\033[0m' %self.name)
time.sleep(2)
mutexA.acquire()
print('\033[44m%s 拿到A锁\033[0m' %self.name)
mutexA.release()
mutexB.release()
if __name__ == '__main__':
#同时开启10个线程
for i in range(10):
t=MyThread()
t.start()
#Thread-1 拿到A锁
#Thread-1 拿到B锁
#Thread-1 拿到B锁(线程1执行完b上锁以后,睡眠2s后,但此时线程2率先抢到a锁,所以等进程2的a锁解开后,才能运行进程1中的fun2的a锁运行,但此时进程2中需要b锁,但进程1中的b锁并未解开,所以产生死锁)
#Thread-2 拿到A锁
2.再帰的ロック
特徴:複数のスレッド間の相互排他は、同じスレッドが同じロックを複数回取得できることを除いて、その効果を持っています
2.同じスレッドのロックとロック解除を同じ回数、他のスレッドがロックを取得できるように保証されなければなりません
3.セマフォ
制限は数1であれば、それは普通のミューテックスと違いはありません、共通のコードを実行する同時スレッドの数を制限することができます
from threading import Semaphore,current_thread,Thread
import time
s = Semaphore(2)#同一时间最大并发2个
def task():
s.acquire()
time.sleep(1)
print(current_thread().name)
s.release()
for i in range(10):
Thread(target=task).start()
# 注意:信号量不是用来解决安全问题的 而是用于限制最大的并发量