ITPub博客

首页 > 应用开发 > > python线程中加锁范围是越大越好还是越小越好呢?

python线程中加锁范围是越大越好还是越小越好呢?

作者:markriver 时间:2019-09-18 09:38:22 0 删除 编辑

把锁放在循环外面

from threading import Thread, Lock
import time

num = 0


def test1():
    global num
    # 上锁
    mutex.acquire()
    for i in range(1000000):
        num += 1
    # 解锁
    mutex.release()
    print("--test1--num=%d" % num)


def test2():
    global num
    mutex.acquire()
    for i in range(1000000):
        num += 1
    mutex.release()
    print("--test2--num=%d" % num)


start_time = time.time()  # 开始时间
# 创建一把互斥锁,默认没有上锁
mutex = Lock()
p1 = Thread(target=test1)
p1.start()

# time.sleep(3)   # 取消屏蔽之后 再次运行程序,结果会不一样,,,为啥呢?

p2 = Thread(target=test2)
p2.start()
p1.join()
p2.join()
end_time = time.time()  # 结束时间
print("num = %d" % num)

print("运行时间:%fs" % (end_time - start_time))  # 结束时间-开始时间

"""
输出结果:
--test1--num=1000000
--test2--num=2000000
num = 2000000
运行时间:0.287206s
"""

把锁放在for里面:

from threading import Thread, Lock
import time

num = 0


def test1():
    global num

    for i in range(1000000):
        # 上锁
        mutex.acquire()
        num += 1
        # 解锁
        mutex.release()
    print("--test1--num=%d" % num)


def test2():
    global num
    for i in range(1000000):
        # 上锁
        mutex.acquire()
        num += 1
        # 解锁
        mutex.release()
    print("--test2--num=%d" % num)


start_time = time.time()  # 开始时间
# 创建一把互斥锁,默认没有上锁
mutex = Lock()
p1 = Thread(target=test1)
p1.start()

# time.sleep(3)   # 取消屏蔽之后 再次运行程序,结果会不一样,,,为啥呢?

p2 = Thread(target=test2)
p2.start()
p1.join()
p2.join()
end_time = time.time()  # 结束时间
print("num = %d" % num)

print("运行时间:%fs" % (end_time - start_time))  # 结束时间-开始时间
"""
输出结果:
--test1--num=1890838
--test2--num=2000000
num = 2000000
运行时间:4.694896s
"""

运行时间差别很大,锁放在什么位置合适呢?

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/818/viewspace-3125357/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-07-03

  • 博文量
    502
  • 访问量
    18492