Ipython: 内核/中断内核不会终止笔记本中卡住的子进程

创建于 2013-06-04  ·  47评论  ·  资料来源: ipython/ipython

当子进程从笔记本运行时,如果它卡住了,内核将被锁定等待它。 从菜单中选择 Kernel/Interrupt 不会终止子进程,而是使内核处于不稳定的“部分锁定”状态,其他单元不会执行。 唯一的解决办法是重新启动内核。

这发生在我的 Windows 上 - 我不知道它是否也发生在 Unix 上。

要进行演示,请启动笔记本并在单元格中输入 !python。 该进程将在等待交互式输入时锁定。 由于无法提供该输入,因此必须重新启动内核才能继续。

qtconsole windows

最有用的评论

我想我只是被这个咬了,我需要重新启动内核,这意味着我刚刚丢失了很多数据......

我正在使用pdb来调试一个函数。 我没有先退出pdb就重新运行了单元格,现在我不能打断任何东西。

这是一个重现此内容的最小示例:

def test():
    import pdb; pdb.set_trace()  # XXX BREAKPOINT
    return 0

test()

连续运行此单元格两次。

所有47条评论

#514 的副本

谢谢,我没有发现重复。 话虽如此,t#514 正在讨论一个更复杂的场景,涉及与子进程的实际交互(它似乎是基于 Unix 的,因为它是关于 pty 风格的交互)。 对于我的要求,杀死一个流氓子进程的简单方法就可以了。 考虑像!sleep 50000这样简单的事情,在这种情况下,您只需要能够终止睡眠即可。 (也许 Ctrl-C 在 Unix 上对此有效,但在 Windows 上无效)。

抱歉,我现在明白你的意思了。 作为一个单独的问题重新打开 - 中断而不是中断 Windows 上的子进程。

我不确定这仅限于子流程。 尝试执行input()raw_input()然后单击中断按钮——内核挂起,必须重新启动。

@arijun在什么操作系统上? 中断输入和 raw_input 在这里引发 KeyboardInterrupt (OS X)。

对不起,窗户。 这就是为什么我认为@pfmoore可能遇到了同样的问题,因为这也发生在 Windows 上。

啊,废话。 我知道那个错误是什么。 我认为这是一个 libzmq(或 pyzmq)错误,它阻止它在对 zmq 套接字进行轮询时正确处理中断。 在 IPython 中什么都不是。 _叹_

我想我只是被这个咬了,我需要重新启动内核,这意味着我刚刚丢失了很多数据......

我正在使用pdb来调试一个函数。 我没有先退出pdb就重新运行了单元格,现在我不能打断任何东西。

这是一个重现此内容的最小示例:

def test():
    import pdb; pdb.set_trace()  # XXX BREAKPOINT
    return 0

test()

连续运行此单元格两次。

同样的问题在 Unix 中也发生在我身上。

“当从笔记本运行子进程时,如果它卡住,内核将被锁定等待它。从菜单中选择内核/中断不会终止子进程,而是使内核处于不稳定的“部分锁定”状态,其他单元不执行。唯一的解决办法是重新启动内核。”

感谢 wmayner 的 pdb 挂起的好例子。 但是由于 pdb 不在子进程中运行,我为 pdb 开了一个单独的问题:#10516

打印太多数据,假设不小心打印了一个巨大的 numpy 数组,会使内核完全无响应且无法终止

是否已经找到了针对此问题的解决方案? 我刚刚运行了一个需要 14 小时才能完成的机器学习模型,现在我的内核卡住了,无法执行单元格。 如果我重新启动,我必须再次运行模型 14 小时。 那么有什么解决办法吗?

还没有尝试过,但这似乎有帮助: http :

如果某个特定的子进程卡住了,您可能可以在任务管理器中找到它并以这种方式强行杀死它。 希望这能让内核继续。

不,问题是内核向网络服务器发送垃圾邮件之类的。 杀死网络服务器会杀死内核 afaik

我也在处理卡住的笔记本:中断、重新启动、重新连接 - 他们都没有做任何事情。 [*]指示器保留在单元旁边,就好像它们在排队运行但没有单元被执行。

该行为在运行包含以下内容的单元格后开始:

filedir = "20161214_rooftest"

!ls -RC $filedir

这很奇怪,因为我在其他地方有类似的单元可以成功运行。 我不确定ls如何/是否会卡住,但否则我的情况似乎与此问题相符。

有没有办法解决这个问题。 内核不能被中断。
对我来说,它发生在 sklearn 的 GridSearchCV 中。

任务管理器中有一个名为 conda.exe 的进程。 我杀死了那个进程,我成功地中断了内核

中断仍然中断。 我每次都必须重新启动并重新加载我的导入。

python 3.7内核上的jupyter实验室中的同样问题

Jupyter Notebook 中存在同样的问题,我在任务管理器中找不到名为 conda.exe 的进程。 解决方案有任何更新吗?

不是解决方案
在这种情况下,有时尝试重新连接到内核会有所帮助

观察相同,在 Windows 10 中

有人成功了吗? 我快疯了

任务管理器中有一个名为 conda.exe 的进程。 我杀死了那个进程,我成功地中断了内核

@ahmedrao怎么样???

这个问题已经存在六年了,仍然没有解决方案。

这个问题已经存在六年了,仍然没有解决方案。

六年无解,重启内核

越来越频繁地遇到同样的问题,几乎到了笔记本变得无法使用的地步,这真是一种耻辱。 在 Anaconda 3.7 上,单元格只是挂着星号,我无法中断内核。

标记相同的问题

一直有这个问题,尤其是 dbg 和 input。
视窗 10; 笔记本服务器 5.7.8; Python 3.6.6.; 康达 4.7.5
了解到我基本上无法可靠地调试笔记本:(

是的,问题仍然存在。 有没有办法克服这个?? 我不想重新运行我的笔记本,因为它需要太长时间才能到达我所在的位置!!

向上!
多年来,每当我使用 pdb 并且在重新运行单元之前忘记退出时,这个问题一直困扰着我。

我在 BountySource 上创建了一个赏金。 如果我们能筹集到足够的钱,也许这最终会得到解决。
https://www.bountysource.com/issues/44958889-hang-after-running-pdb-in-a-cell-kernel-interrupt-doesn-t-help

对于进程问题,特别是在 Windows 上,这里有一个理论(仍未测试):

  1. 进程通过IPython.utils._process_win32.system ,它调用_system_body ,它在subprocess.Popen对象上调用p.wait()
  2. Windows subprocess.Popen.wait()有一个不可中断的已知问题: https :

如果这就是原因,切换到每 100 毫秒左右的忙循环可能会使其可中断,或者如果不是,则在补丁中采用这种方法。

谢谢@Carreau!

谢谢@Carreau! 这什么时候会进入正式版本,这是否意味着我们将能够成功使用中断内核按钮?

我明天可能会做 7.13。 它可能会修复中断按钮。

嘿@Carreau
当我试图中断正在进行的单元格执行时,我正面临这个问题,中断永远持续,最后我必须重新启动。

因此,为了演示,正如@wmayner建议的那样,可以复制该问题。 我附上了一些相同的屏幕截图。
pyt1

我机器上的 Jupyter 版本。
pyt2

@Arpit-Gole pdb 是它自己的特定问题; 我也希望尽快解决这个问题: https :

@itamarst我正在训练一个模型如下:

forest_clf = RandomForestClassifier() cross_val_score(forest_clf, X_train, y_train, cv=3, scoring='accuracy', verbose=10, n_jobs=-1)

现在我知道根据我的数据集肯定需要时间。 但是无论出于何种原因,我都选择按Kernel>Interrupt Kernel来中途停止处理。
理想情况下,它应该中断,但需要永远停止。
现在我不想重新开始,因为我所有的进步都将消失。

请帮忙!

如果您尝试中断的内容是用 C 实现的,那么就无事可做。 这取决于您用来处理 sigint 的库。

我有时也会遇到这个问题......这是来自 jupyer 实验室的一个可复制的例子:

加载数据

import requests
import pandas as pd

url='https://raw.githubusercontent.com/numenta/NAB/master/data/realKnownCause/nyc_taxi.csv'
r = requests.get(url, allow_redirects=True)
        with open('data/nyc_taxi.csv', 'wb') as f:
            f.write(r.content)
df_taxi = (
        pd.read_csv('data/nyc_taxi.csv')
        .assign(timestamp=lambda x: pd.to_datetime(x.timestamp))
)

df_train = df_taxi.iloc[:5000]
temp_train = df_train.set_index('timestamp')

运行网格搜索:这不能被打断

import itertools
#set parameter range
p = range(0,3)
q = range(1,3)
d = range(1,2)
s = [24,48]

# list of all parameter combos
pdq = list(itertools.product(p, d, q))
seasonal_pdq = list(itertools.product(p, d, q, s))
# SARIMA model pipeline
for param in pdq:
    for param_seasonal in seasonal_pdq:
        try:
            mod = sm.tsa.statespace.SARIMAX(temp_train[:240],
                                            order=param,
                                            seasonal_order=param_seasonal)

            results = mod.fit(max_iter = 50, method = 'powell')

            print('SARIMA{},{} - AIC:{}'.format(param, param_seasonal, results.aic))
        except as e:
            print(e)
            continue

有什么建议吗?

今天下午遇到这个问题3次,让我想起了我还在使用urllib的美好时光。
认为它在 urllib 上,因为我的请求没有响应。
我正在工作但编码,我必须找到解决方案但答案。 所以我将每个变量存储到本地文件。
真的不想看到这样的事情一次又一次地发生。

在使用 tensorflow 和 gpu 训练深度学习模型时,我面临同样的问题。

使用 time.sleep 和 requests 遇到这个问题

Windows 上的 time.sleep 请求也存在此问题,但在 Mac OS X 上运行良好

ThreadPoolExecutor 有这个问题......像这样:

numberOfImageGatherers = 2

with concurrent.futures.ThreadPoolExecutor(max_workers=numberOfImageGatherers + 1) as executor:
        futures = []

        for imageGatherer in range(numberOfImageGatherers):
            imageDataGatherer = ImageDataGatherer(batch_size)
            futures.append(executor.submit(imageDataGatherer.gatherImageData, pipeline))

        modelTrainingConsumer = ModelTrainingConsumer(vae, plot_losses)    

        futures.append(executor.submit(modelTrainingConsumer.trainModel, pipeline))

        concurrent.futures.wait(futures)

中断的唯一方法是重新启动内核......非常令人沮丧

此页面是否有帮助?
0 / 5 - 0 等级