首页 新闻 会员 周边

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

0
[已解决问题] 解决于 2020-04-04 11:41

把锁放在循环外面

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
"""

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

三国小梦的主页 三国小梦 | 菜鸟二级 | 园豆:202
提问于:2019-08-24 16:34
< >
分享
最佳答案
0

你有没有放for 里面本质就不一样,锁的意义就是把并发变成串行,锁的放的位置根据需求来

奖励园豆:5
小小咸鱼YwY | 老鸟四级 |园豆:3210 | 2019-08-24 16:59

我是在学习锁的使用,人家说锁的使用范围应该越小越好,看到运行时间我就懵了。

三国小梦 | 园豆:202 (菜鸟二级) | 2019-08-24 17:03

@三国小梦: 什么哦,你每次都把并发变成串行,你觉得for范围变小了???范围都是一样的没有变,反而会在原来的基础上加了198次开锁关锁,多出来的时间是这里

小小咸鱼YwY | 园豆:3210 (老鸟四级) | 2019-08-24 17:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册