我想知道我是否通过多处理创建了一个字典。Mananger(),当处理操作它时,它的值会自动锁定,还是我应该显式地编写 lock.acquire/release?
以前,我在函数中显式编写了 lock.acquire/release,但是,似乎我的代码存在死锁问题。这很奇怪,因为我认为我的代码中只有一个锁。因此,我想知道 manager.dict 是否会自动提供另一个锁。当我删除 lock.acquire/release 时,代码工作正常。但我不确定该词是否正确。
import multiprocessing as mp
from functools import partial
def function(file_name, d, lock):
key, value = read_files(file_name)
#lock.acquire()
if (key not in d):
d[key] = []
tmp = d[key]
tmp.append(value)
d[key] = tmp
#lock.release()
if __name__ == '__main__':
manager = mp.Manager()
d = manager.dict()
lock = manager.Lock()
partial_function = partial(function, d=d, lock=lock)
pool = mp.Pool(10)
pool.map(partial_function, files) #files is a predefined list
pool.close()
pool.join()
下面列出了一些相关问题,但它们似乎相互矛盾。
为什么 manager.dict 在写进去之前需要锁定?
python manager.dict() 锁定的工作原理:
是的,"锁定"会自动发生multiprocessing.Manager().dict()
。它是线程安全的,因为内部结构只允许一个进程在任何给定时间访问(读取或写入)对象。