以下代码
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
行以创建元组列表。每个元组将是一个任务的参数。
另外,我猜您想将
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}