为什么使用锁来读取/写入共享内存比不使用锁更快

问题描述

我正在尝试使用Python多处理,而使用锁时却看到了直观的反结果。

我的假设是,在使用共享内存时,如果我们使用锁来确保一次只能有一个进程可以访问共享对象,则所有其他进程将在读/写之前等待锁进程释放锁。共享对象。因此,尽管这确保了数据完整性并消除了竞争状况,但这也将不可避免地导致除一个进程之外的所有进程都等待锁定进程。结果,与不使用锁时相比,执行的总时间将更长。如果不使用锁,则所有进程都不会彼此等待,因此可以更快地完成,但也会破坏数据。

考虑到这一点,我编写了一个快速程序,以找出使用锁的速度到底要慢多少,但是令人惊讶的是,使用锁实际上实际上要快得多。

您能解释一下为什么使用锁更快吗?我对锁的工作原理了解不对?还是我设置实验的方式有问题(下面的代码)。

如果lock.acquire()lock.release()注释,因此不使用锁定,则需要 75.85 秒,
如果lock.acquire()lock.release()未注释的,则使用锁定需要 57.17
我正在使用Python 3.7, 在Intel i7 8550U上运行,具有4个物理核心(8个具有超线程的线程)

import os
import multiprocessing as mp
from timeit import default_timer as timer


def func(n,val,lock,add):
    for i in range(n):
        lock.acquire()  # uncomment to use lock
        if add:
            val.value += 1
        else:
            val.value -= 1
        lock.release()  # uncomment to use lock
        if i % (n/10) == 0:
            print(f"Process: {os.getpid()},{(i / n * 100):.2f}%")


if __name__ == "__main__":
    start = timer()
    lock = mp.Lock()
    n = 2000000
    val = mp.Value('i',100)
    arr = mp.Array('i',10)

    p1 = mp.Process(target=func,args=(n,True))
    p2 = mp.Process(target=func,False))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    elapsed = timer() - start
    print("Time elapsed = {}".format(elapsed))
    print(f"Val = {val.value}")

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)