python - 多处理池的 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
解决方案
这不是一个真正的答案,但由于注释不能很好地格式化代码,我会把它放在这里即使在纯 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:
...
推荐阅读
- html - 当其他轨道增长时,CSS网格的轨道不会缩小
- c# - 尝试获取登录令牌时 AppDelegate 中出现未处理的异常 (iOS)
- android - 音频完成播放时如何更改播放图标按钮
- javascript - angular 6密码验证不起作用
- css - mat-toolbar 的宽度与 mat-sidenav 不匹配
- python - 以原始形式显示和或 in 的源代码的逻辑操作
- r - 按最近日期识别组内的重复项
- generics - Dart 使用 IS 运算符检查泛型类型
- docker - 我们可以构建启用 GUI 的基本 docker 映像(无 X11 转发)吗?
- ios - 使用 Swift 5.0 编译的模块不能被 Swift 4.2.1 编译器导入