如果在Jupyter Notebook中中断内核无法运行,如何停止正在运行的单元格?

80

我已经使用Jupyter Notebook有一段时间了。经常情况下,当我尝试停止单元格的执行时,中断内核并不起作用。在这种情况下,除了关闭笔记本并重新启动之外,我还能做什么呢?我想这可能是许多人常遇到的情况。


3
不幸的是,截至2022年,答案仍然是没有好的解决方案。这是一个存在超过10年的问题。事实上,它仍未得到解决表明它太难或优先级太低,很难期望很快就能得到修复。 - eric
12个回答

23

9

如果您不介意失去当前定义的所有变量,那么转到Kernel> Restart将停止执行而不关闭笔记本。


53
如果不是这样,会怎么样呢? - MysteryGuy
3
据我所知,你运气不好。检查一下你的计算或者只能希望中断不会发生问题。 - hamdog

7
这对我行得通: - 让笔记本电脑进入睡眠模式(其中一个电源选项) - 等待10秒钟 - 用电源按钮唤醒计算机
然后内核会说正在重新连接,要么是中断了,要么你可以按中断键。
这可能不是百分之百可靠的方法,但值得一试,这样你就不会浪费以前的计算时间。 (我曾经在运行Jupyter Notebook的Windows 10上运行Selenium代码时无法停止)

6
哎呀,这个解决方法真是绕。不过我还是点了个赞。 - Szczepan Hołyszewski

5

以下是几个选项:

  • 更改数据文件夹名称: 如果单元格已经在运行并从特定文件夹中提取数据,则可以使用此方法。例如,我有一个for循环,当中断时就会移到正在处理的列表中的下一项。

  • 更改单元格中的代码以生成错误: 如果该单元格尚未运行但只是在队列中,则可以使用此方法。

  • 重启内核: 如果所有其他方法都失败了。


1
更改文件名对我有用。点赞 - hypnos

3

15
请在此处撰写答案的相关部分,因为链接可能会随时间变化而改变。 - Harsh Wardhan
6
那么解决方案是什么? - keramat
这不是一个答案,也没有被解决,据我所知。 - eric

3

有一种可能有效的方法是多次按中断键。可能你正在使用的某个库会捕获中断信号,并在接收到多次信号后停止。

例如,当使用 sklearn 的 cross_val_score() 时,我发现每个交叉验证折叠都需要按一次中断键。


2

如果您事先知道可能需要停止而不丢失所有变量,则以下解决方案可能很有用:

对于因长时间循环而花费时间的单元格,您可以在循环中实现以下内容:

if os.path.exists(os.path.join(os.getcwd(),'stop_true.txt')):
    break

如果你想停止循环,只需创建文件“stop_true.txt”。下一轮循环之前,循环将停止。

通常,该文件称为“stop_false.txt”,直到我将其重命名以停止循环。

此外,每个循环的结果都会单独存储在一个字典中。因此,我能够保留所有结果,直到发生中断,并可以从此点重新启动循环。


本答案的灵感来自于 @EddyWD - Thomas R

0
对我来说,设置时间限制起作用:https://github.com/scipopt/PySCIPOpt/issues/197。具体来说,我添加了“model.setRealParam("limits/time", 60)”代码片段,它会在60秒后自动停止计算。您可以设置任何时间而不是60。但这是针对pyscipopt包(解决优化模型)的。我不确定如何为您的特定问题设置时间限制。

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

尝试以下操作:

  1. 关闭正在运行Jupyter的浏览器标签页
  2. 运行 jupyter server list
  3. 使用 jupyter server stop <PORT> 命令停止每个正在运行的服务器

0
如果iPython内核没有死亡,您可能可以使用pyrasite将重要数据保存到其中的Python代码。您需要以root身份安装和运行pyrasite,即使用sudo python -m pip install pyrasitepython3(根据需要)。然后,需要找出iPython内核的进程ID(PID)(例如通过htopps aux | grep ipython),比如说是3873。接着,编写一个脚本来将状态保存为例如pickle文件中的inject.py,例如全局范围内的Pandas dataframe df
df.to_pickle("rescued_df.pkl")

最后,将其注入进程,如下所示:
sudo pyrasite 3873 inject.py

您可能需要先启用dtrace,方法如下:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接