我希望使用Python的多进程模块将字典列表相加。
以下是我的简化代码:
以下是我的简化代码:
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import multiprocessing
import functools
import time
def merge(lock, d1, d2):
time.sleep(5) # some time consuming stuffs
with lock:
for key in d2.keys():
if d1.has_key(key):
d1[key] += d2[key]
else:
d1[key] = d2[key]
l = [{ x % 10 : x } for x in range(10000)]
lock = multiprocessing.Lock()
d = multiprocessing.Manager().dict()
partial_merge = functools.partial(merge, d1 = d, lock = lock)
pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = pool_size)
pool.map(partial_merge, l)
pool.close()
pool.join()
print d
运行此脚本时,我遇到了这个错误。我该如何解决?
RuntimeError: Lock objects should only be shared between processes through inheritance
在这种情况下,在
merge
函数中是否需要lock
,或者Python会自动处理它?我认为
map
应该做的是将一个列表中的内容映射到另一个列表中,而不是将所有内容都倒入单个对象中。所以有没有更优雅的方法来完成这样的事情?