同步锁
同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。”同”字从字面上容易理解为一起动作,其实不是,”同”字应是指协同、协助、互相配合。
如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。这既是同步
python对线程加锁主要有Lock和Rlock模块
注意:
- 加锁还可以使用with 效果一样
- 必须使用同一把锁
- 如果使用锁,程序会变成串行,因此应该是在适当的地方加锁 线程调度本质上是不确定的,因此,在多线程程序中错误地使用锁机制可能会导致随机数 据损坏或者其他的异常行为,我们称之为竞争条件。为了避免竞争条件,最好只在临界区(对 临界资源进行操作的那部分代码)使用锁
加同步锁之前
import threading
num = 0
def fun1():
global num
for _ in range(100000):
num += 1
print(threading.currentThread(), num)
if __name__ == '__main__':
thread_list = []
for i in range(5):
t = threading.Thread(target=fun1)
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print("主线程结束")
<Thread(Thread-1, started 140215479097088)>215268
<Thread(Thread-3, started 140215462311680)>260556
<Thread(Thread-2, started 140215470704384)>282713
<Thread(Thread-4, started 140215247173376)>382713
<Thread(Thread-5, started 140215462311680)>482713
主线程结束
添加同步锁之后
import threading
num = 0
def fun1():
global num
lock.acquire() #获得锁
for _ in range(100000):
num += 1
lock.release() #释放锁
print(threading.currentThread(), num)
if __name__ == '__main__':
thread_list = []
lock=threading.Lock() #创建同步锁对象
for i in range(5):
t = threading.Thread(target=fun1)
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print("主线程结束")
<Thread(Thread-1, started 139664333801216)>100000
<Thread(Thread-2, started 139664325408512)>200000
<Thread(Thread-3, started 139664317015808)>300000
<Thread(Thread-4, started 139664308623104)>400000
<Thread(Thread-5, started 139664317015808)>500000
通过with获得锁与自动释放锁
import threading
num = 0
def fun1():
global num
with lock: #获得锁
for _ in range(100000):
num += 1
print(threading.currentThread(), num)
if __name__ == '__main__':
thread_list = []
lock=threading.Lock() #创建同步锁对象
for i in range(5):
t = threading.Thread(target=fun1)
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print("主线程结束")
版权声明:本文为qq_52751442原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。