首页 > 解决方案 > 多处理池的 Jupyter 笔记本问题

问题描述

我试图Multiprocessing在我的代码中应用,我遇到了这个例子

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 中运行它时,它并没有结束,我必须为此重置内核。使用 Jupyter 或 Anaconda 有什么特殊问题Multiprocessing吗?

我正在使用

conda version 4.8.4
ipython version 5.8.0

标签: pythonjupyter-notebookmultiprocessinganaconda3

解决方案


这不是一个真正的答案,但由于注释不能很好地格式化代码,我会把它放在这里即使在纯 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)

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

但是如果你只需要类似的功能,我推荐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:
   ...

推荐阅读