多线程开发–同步锁

  • Post author:
  • Post category:其他

同步锁

同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。”同”字从字面上容易理解为一起动作,其实不是,”同”字应是指协同、协助、互相配合。

如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。这既是同步

python对线程加锁主要有Lock和Rlock模块

注意:

  1. 加锁还可以使用with 效果一样
  2. 必须使用同一把锁
  3. 如果使用锁,程序会变成串行,因此应该是在适当的地方加锁 线程调度本质上是不确定的,因此,在多线程程序中错误地使用锁机制可能会导致随机数 据损坏或者其他的异常行为,我们称之为竞争条件。为了避免竞争条件,最好只在临界区(对 临界资源进行操作的那部分代码)使用锁

加同步锁之前

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 版权协议,转载请附上原文出处链接和本声明。