多进程或多处理不起作用[编辑]列表(zip(a,b,))行为

问题描述 投票:0回答:1

以下代码

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 个值,但两者都是空的,任何人都可以帮助我吗?

python multiprocessing shared-memory python-zip
1个回答
0
投票

在这种情况下,多处理是一个转移注意力的东西。如果在定义后打印

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}
© www.soinside.com 2019 - 2024. All rights reserved.