[英]python multiprocessing lock issue
我想添加一个dicts列表和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
在这种情况下需要lock
merge
功能吗? 或者python会照顾它吗?
我认为map
应该做的是将某个列表中的某些内容映射到另一个列表,而不是将一个列表中的所有内容转储到单个对象中。 那么有更优雅的方式来做这些事情吗?
以下内容应该在Python 2和3中跨平台运行(即在Windows上运行)。它使用进程池初始化程序将manager dict设置为每个子进程中的全局。
供参考:
Pool
的进程数默认为CPU计数。 apply_async
而不是map
。 import multiprocessing
import time
def merge(d2):
time.sleep(1) # some time consuming stuffs
for key in d2.keys():
if key in d1:
d1[key] += d2[key]
else:
d1[key] = d2[key]
def init(d):
global d1
d1 = d
if __name__ == '__main__':
d1 = multiprocessing.Manager().dict()
pool = multiprocessing.Pool(initializer=init, initargs=(d1, ))
l = [{ x % 5 : x } for x in range(10)]
for item in l:
pool.apply_async(merge, (item,))
pool.close()
pool.join()
print(l)
print(d1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.