cur*_*ist 11 python multiprocessing jupyter
我是multiprocessing
Python 模块的新手,并且使用 Jupyter 笔记本。我已经尝试了以下来自PMOTW 的代码片段:
import multiprocessing
def worker():
"""worker function"""
print('Worker')
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
当我按原样运行时,没有输出。
我还尝试创建一个名为的模块worker.py
,然后将其导入以运行代码:
import multiprocessing
from worker import worker
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
在这种情况下仍然没有输出。在控制台中,我看到以下错误(重复多次):
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\Anaconda3\lib\multiprocessing\spawn.py", line 106, in spawn_main
exitcode = _main(fd)
File "C:\Program Files\Anaconda3\lib\multiprocessing\spawn.py", line 116, in _main
self = pickle.load(from_parent)
AttributeError: Can't get attribute 'worker' on <module '__main__' (built-in)>
Run Code Online (Sandbox Code Playgroud)
但是,当代码保存为 Python 脚本并执行时,我得到了预期的输出。
如何在不创建单独脚本的情况下直接从笔记本运行此代码?
Ede*_*nor 16
我对并行计算比较陌生,所以我可能对某些技术有误解。我的理解是这样的:
Jupyter 笔记本无法使用,multiprocessing
因为模块腌制(序列化)要发送到进程的数据。
multiprocess
是一个multiprocessing
使用 dill 而不是 pickle 来序列化数据的分支,它允许它在 Jupyter notebooks 中工作。API 是相同的,因此您唯一需要做的就是更改
import multiprocessing
Run Code Online (Sandbox Code Playgroud)
到...
import multiprocess
Run Code Online (Sandbox Code Playgroud)
你可以multiprocess
很容易地安装一个简单的
pip install multiprocess
Run Code Online (Sandbox Code Playgroud)
但是,您会发现您的进程仍然不会打印到输出(尽管在 Jupyter 实验室中,它们会打印到正在运行服务器的终端)。我偶然发现了这篇试图解决这个问题的帖子,当我找到方法时将编辑这篇文章。
小智 7
我不是 inmultiprocessing
或 in ipykernel
(由 jupyter Notebook 使用)的导出,但因为似乎没有人给出答案,所以我会告诉你我的猜测。希望以后有人能补充一下。
我猜你的 jupyter 笔记本服务器正在 Windows 主机上运行。在多处理中,存在三种不同的启动方法。让我们重点关注spawn(Windows 上的默认值)和fork(Unix 上的默认值)。
这是一个快速概述。
产卵
if __name__ == '__main'__
叉
例如,
import multiprocessing
def worker():
"""worker function"""
print('Worker')
return
if __name__ == '__main__':
multiprocessing.set_start_method('spawn')
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
此代码在保存并作为脚本运行时可以工作,但在 python 交互式 shell 中输入时会引发错误。这是 ipython 内核的实现,我的猜测是它使用了某种交互式 shell,因此与spawn不太兼容(但请不要相信我)。
作为旁注,我将向您介绍spawn和fork有何不同。每个子进程在多处理中运行不同的 python 解释器。特别是,使用spawn,子进程启动一个新的解释器并从头开始导入必要的模块。在交互式 shell 中导入代码很困难,因此可能会引发错误。
叉子是不同的。通过fork,子进程复制主进程,包括python解释器的大部分运行状态,然后继续执行。这段代码将帮助您理解这个概念。
import os
main_pid = os.getpid()
os.fork()
print("Hello world(%d)" % os.getpid()) # print twice. Hello world(id1) Hello world(id2)
if os.getpid() == main_pid:
print("Hello world(main process)") # print once. Hello world(main process)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14113 次 |
最近记录: |