PHP前端开发

Python 线程加锁:范围越小越好,但这真的总是对的吗?

百变鹏仔 5天前 #Python
文章标签 越好

python线程中加锁范围越小越好

问题说明

在python线程中,使用锁保证多个线程对共享数据的并发访问时,加锁的范围是一个重要的问题,是将锁放在循环外面还是里面。

对比两种情况

立即学习“Python免费学习笔记(深入)”;

把锁放在循环外面:

from threading import thread, lockimport timenum = 0mutex = lock()  # 创建一把互斥锁def test1():    for i in range(1000000):        # 上锁        mutex.acquire()        num += 1        # 解锁        mutex.release()def test2():    for i in range(1000000):        # 上锁        mutex.acquire()        num += 1        # 解锁        mutex.release()if __name__ == "__main__":    start_time = time.time()  # 开始时间    p1 = thread(target=test1)    p1.start()    p2 = thread(target=test2)    p2.start()    p1.join()    p2.join()    end_time = time.time()  # 结束时间    print("运行时间:%.2fs" % (end_time - start_time))

把锁放在for里面:

from threading import Thread, Lockimport timenum = 0mutex = Lock()  # 创建一把互斥锁def test1():    for i in range(1000000):        if mutex.acquire(False):  # 尝试获取锁,成功则返回True,否则返回False            num += 1            mutex.release()  # 释放锁def test2():    for i in range(1000000):        if mutex.acquire(False):  # 尝试获取锁,成功则返回True,否则返回False            num += 1            mutex.release()  # 释放锁if __name__ == "__main__":    start_time = time.time()  # 开始时间    p1 = Thread(target=test1)    p1.start()    p2 = Thread(target=test2)    p2.start()    p1.join()    p2.join()    end_time = time.time()  # 结束时间    print("运行时间:%.2fs" % (end_time - start_time))

选择建议

根据实际需求来选择加锁范围。

常见的错误