关于QMutex 和QWaitCondition()
1 from PySide2.QtCore import QThread, QWaitCondition, QMutex 2 con = QWaitCondition() 3 mutex = QMutex() 4 5 class Worker1(QThread): 6 #sinOut = Signal(str) 7 8 def __init__(self): 9 super(Worker1, self).__init__() 10 #设置工作状态与初始num数值 11 self.working = True 12 13 def run(self): 14 self.sleep(1) 15 print('Worker1 lock 前') 16 mutex.lock() 17 #self.sleep(2) 18 print('Worker1 is locking') 19 i = 0 20 while 1: 21 print('work1:',i) 22 self.sleep(0.5) 23 i+=1 24 if i == 5: 25 con.wakeAll() 26 print('work1 is ready to sleep') 27 28 con.wait(mutex) 29 30 print('work1 is sleep') 31 if i == 10: 32 break 33 34 print('~~~work1 unlock 前~~~') 35 mutex.unlock() 36 print('~~~work1 unlock 后~~~') 37 38 39 40 41 class Worker2(QThread): 42 #sinOut = Signal(str) 43 44 def __init__(self): 45 super(Worker2, self).__init__() 46 #设置工作状态与初始num数值 47 self.working = True 48 49 def run(self): 50 print('Worker2 lock 前 ') 51 mutex.lock() 52 53 print('Worker2 is locking') 54 i = 0 55 print('woker2 准备wait') 56 con.wait(mutex) 57 print('woker2 wait 后') 58 while 1: 59 60 print('work2:',i) 61 i+=1 62 self.sleep(0.5) 63 if i == 8: 64 print('woker 准备 唤醒动作') 65 con.wakeAll() 66 print('work2 完成唤醒动作') 67 if i == 10: 68 break 69 print('work2 unlock 前') 70 mutex.unlock() 71 print('work2 unlock 后') 72 73 74 w2 = Worker2() 75 w2.start() 76 w1 = Worker1() 77 w1.start() 78 79 80 print('____main____')
关于w1 和w2 谁先运行,可以在线程中 增加self.sleep,见 14 行
关于 尾巴 部分 mutex.unlock,如果不使用 情况如下:

重点:
con.wakeAll()
print('work1 is ready to sleep')
for j in range(3):
print('j')
self.sleep(1)
con.wait(mutex)
线程1 中出现wakeAll 之后 不会直接调转到 B的 con.wait 后运行,而是 A继续运行 直遇到 con.wait(mutex) 或者 mutex.unlock
如果线程 B 中 最后 去除了mutex.unlock,那么 程序 会一直 卡着,无法 切入到 A 中:最后一次 con.wakeAll后 本来应该遇到 wait或者unlock 这种 阻挡 才能切走,但是目前 没有阻挡了,无法 反弹了

浙公网安备 33010602011771号