Lor*_*lli 3 python multiprocessing python-2.7 python-multiprocessing multiprocessing-manager
一个managers.dict()允许共享跨越进程字典和执行线程安全的操作。在我的情况下,每个协调器进程创建共享字典,其中m元素和n工作进程从单个字典键读取和写入。
是否managers.dict()有一个单独的 dict 或mlocks 锁,一个用于其中的每个键?
当工作人员不必相互通信时,除了共享 dict 之外,还有其他方法可以m向n工作人员共享元素吗?
相关的python-manager-dict-is-very-slow-compared-to-regular-dict
经过一些尝试,我可以说每个 manager dict 只有一个锁。这是证明它的代码:
import time
import multiprocessing as mp
def process_f(key, shared_dict):
values = [i for i in range(64 * 1024 * 1024)]
print "Writing {}...".format(key)
a = time.time()
shared_dict[key] = values
b = time.time()
print "released {} in {}ms".format(key, (b-a)*1000)
def main():
process_manager = mp.Manager()
n = 5
keys = [i for i in range(n)]
shared_dict = process_manager.dict({i: i * i for i in keys})
pool = mp.Pool(processes=n)
for i in range(n):
pool.apply_async(process_f, (keys[i], shared_dict))
time.sleep(20)
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
输出:
Writing 4...
Writing 3...
Writing 1...
Writing 2...
Writing 0...
released 4 in 3542.7968502ms
released 0 in 4416.22900963ms
released 1 in 6247.48706818ms
released 2 in 7926.97191238ms
released 3 in 9973.71196747ms
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
写作时间的增加表明正在发生的等待。