多处理池的 Jupyter Notebook 问题

Jupyter notebook issues with Multiprocessing Pool

我正在尝试在我的代码中应用 Multiprocessing,并且我将 运行 应用到此 example:

import multiprocessing
from itertools import product

def merge_names(a, b):
    return '{} & {}'.format(a, b)

if __name__ == '__main__':
    names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
    with multiprocessing.Pool(processes=3) as pool:
        results = pool.starmap(merge_names, product(names, repeat=2))
    print(results)

这应该不会超过几秒钟,但是当我在 Jupyter Notebook 中 运行 它并没有结束时,我必须为此重置内核。使用 Multiprocessing 时 Jupyter 或 Anaconda 有任何特殊问题吗?

我正在使用

conda version 4.8.4
ipython version 5.8.0

这不是一个真正的答案,但由于评论不能很好地格式化代码,我会把它放在这里 即使在纯 python 3.8(虽然通过 conda 安装)中,您的代码对我也不起作用 - 我认为它没有连接到 jupyter 或 ipython.

这段代码对我有用:

import multiprocessing
from itertools import product

names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
with multiprocessing.Pool(processes=3) as pool:
    results = pool.starmap('{} & {}'.format, product(names, repeat=2))
print(results)

因此,pickle 自定义函数并将其发送到池中似乎存在一些问题 - 我不知道原因,也不知道解决方案。

但是如果你只是需要类似的功能,我推荐joblib

from joblib import Parallel, delayed
from itertools import product

def merge_names(a, b):
    return '{} & {}'.format(a, b)

names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie']
result = Parallel(n_jobs=3, prefer="processes")(delayed(merge_names)(a, b) for a,b in product(names, repeat=2))
print(result)

joblib 具有类似的工人池结构,然后可以根据需要类似地使用它:

with Parallel(n_jobs=2) as parallel:
   ...