以下代码
import multiprocessing as mp
from multiprocessing.managers import SyncManager
n_cores = mp.cpu_count()
def parallel_fn(job_n, cache):
cache['job_b'] = job_n
return job_n
if __name__=="__main__":
with SyncManager() as manager:
shared_cache = manager.dict()
args = list(zip(range(n_cores), shared_cache))
with mp.Pool(n_cores) as pool:
result = pool.starmap(parallel_fn, args)
print(result)
print(shared_cache)
退货
16
Shared dict before: {}
Pool return: []
Shared dict after: {}
我期望从池中返回 16 个值,在共享字典中返回 16 个值,但两者都是空的,任何人都可以帮助我吗?
在这种情况下,多处理是一个转移注意力的东西。如果在定义后打印
args
,您将看到一个空列表。您需要按如下所示修复 zip
行以创建元组列表。 zip
返回两个(或多个)项目中较短的一个。在本例中,您有一个长度为 16 的 range
对象和一个长度为 0 的 ProxyDict
对象(开始时它是空的)。作为一个小例子,请查看:list(zip([1, 2], dict()))
,它返回长度为 0 的列表。
另外,我猜您想将
job_n
作为缓存字典中的名称。
import multiprocessing as mp
from multiprocessing.managers import SyncManager
n_cores = mp.cpu_count()
def parallel_fn(job_n, cache):
# Change 'job_b' to job_n
cache[job_n] = job_n
return job_n
if __name__=="__main__":
with SyncManager() as manager:
shared_cache = manager.dict()
# Create a list of tuples to use as args in starmap
args = [(n, shared_cache) for n in range(n_cores)]
with mp.Pool(n_cores) as pool:
result = pool.starmap(parallel_fn, args)
print(result)
print(shared_cache)
在我的8核机器上,输出是:
[0, 1, 2, 3, 4, 5, 6, 7]
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7}