Ipython: Kernel / Interrupt Kernel no finaliza los subprocesos atascados en el cuaderno

Creado en 4 jun. 2013  ·  47Comentarios  ·  Fuente: ipython/ipython

Cuando se ejecuta un subproceso desde el portátil, si se atasca, el kernel se bloqueará esperándolo. Seleccionar Kernel / Interrupt en el menú no termina el subproceso, sino que deja el kernel en un estado inestable, "parcialmente bloqueado", donde otras celdas no se ejecutan. La única solución es reiniciar el kernel.

Esto me ocurrió en Windows; no sé si también ocurre en Unix.

Para demostrarlo, inicie un cuaderno e ingrese! Python en una celda. El proceso se bloqueará mientras espera una entrada interactiva. Como no hay forma de proporcionar esa entrada, el kernel debe reiniciarse para continuar.

qtconsole windows

Comentario más útil

Creo que esto me mordió y tendré que reiniciar el kernel, lo que significa que acabo de perder muchos datos ...

Estaba usando pdb para depurar una función. Volví a ejecutar la celda sin salir primero de pdb , y ahora no puedo interrumpir nada.

Aquí hay un ejemplo mínimo que reproduce esto:

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

test()

Ejecute esta celda dos veces seguidas.

Todos 47 comentarios

duplicado de # 514

Gracias, no había visto el duplicado. Habiendo dicho eso, t # 514 está discutiendo un escenario mucho más complejo, que involucra la interacción real con subprocesos (y parece estar basado en Unix, ya que se trata de una interacción estilo pty). Para mis requisitos, un medio simple de matar a un subproceso deshonesto sería suficiente. Considere algo tan simple como !sleep 50000 , donde lo único que desea es poder matar el sueño. (Quizás Ctrl-C funcione para esto en Unix, pero no en Windows).

Lo siento, veo lo que quieres decir ahora. Reapertura como un problema separado: interrumpa, no interrumpa los subprocesos en Windows.

No estoy seguro de que esto se limite a los subprocesos. Intente ejecutar input() o raw_input() y luego haga clic en el botón de interrupción: el kernel se bloquea y debe reiniciarse.

@arijun en ¿Qué sistema operativo? interrumpir la entrada y raw_input aumenta KeyboardInterrupt aquí (OS X).

Lo siento, windows. Por eso pensé que probablemente era el mismo problema que tenía @pfmoore , ya que eso también sucedió en Windows.

Oh, mierda. Sé cuál es ese error. Creo que es un error de libzmq (o pyzmq) que le impide manejar las interrupciones correctamente mientras realiza el sondeo en los sockets zmq. No es nada en IPython. _suspiro_

Creo que esto me mordió y tendré que reiniciar el kernel, lo que significa que acabo de perder muchos datos ...

Estaba usando pdb para depurar una función. Volví a ejecutar la celda sin salir primero de pdb , y ahora no puedo interrumpir nada.

Aquí hay un ejemplo mínimo que reproduce esto:

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

test()

Ejecute esta celda dos veces seguidas.

Este mismo problema me ocurre en Unix también palabra por palabra.

"Cuando se ejecuta un subproceso desde el portátil, si se atasca, el kernel se bloqueará esperándolo. Seleccionar Kernel / Interrupt en el menú no termina el subproceso, sino que deja el kernel en un estado inestable," parcialmente bloqueado " , donde otras celdas no se ejecutan. La única solución es reiniciar el kernel ".

Gracias por el buen ejemplo de un pdb hang, wmayner. Pero como pdb no se ejecuta en un subproceso, abrí un problema separado para pdb: # 10516

La impresión de demasiados datos, digamos que se imprime accidentalmente una matriz numérica gigantesca, puede hacer que el kernel no responda por completo y sea imposible de terminar.

¿Se ha encontrado ya una solución para este problema? Acabo de ejecutar un modelo de aprendizaje automático que tardó 14 horas en completarse y ahora mi kernel está bloqueado y no ejecuta celdas. si reinicio, tengo que ejecutar el modelo nuevamente durante 14 horas. Entonces, ¿hay alguna solución?

Si un subproceso específico se atascó, probablemente pueda encontrarlo en el administrador de tareas y eliminarlo por la fuerza de esa manera. Con suerte, eso permitirá que el kernel continúe.

no, el problema es que el kernel envía spam al servidor web hasta la muerte o algo así. matar el servidor web mata el kernel afaik

También estoy lidiando con un cuaderno atascado: interrumpir, reiniciar, volver a conectar, ninguno de ellos hace nada. Los indicadores [*] permanecen junto a las celdas como si estuvieran en cola para ejecutarse, pero no se ejecuta ninguna celda.

El comportamiento comenzó después de ejecutar una celda que contenía:

filedir = "20161214_rooftest"

!ls -RC $filedir

Lo cual es extraño porque tengo células análogas en otros lugares que se ejecutan con éxito. No estoy seguro de cómo / si ls podría atascarse, pero de lo contrario, mi situación parece coincidir con este problema.

Hay alguna solución para esto . Kernal no puede ser interrumpido.
Para mí, está sucediendo con GridSearchCV en sklearn.

Había un proceso llamado conda.exe en el Administrador de tareas. Maté ese proceso y pude interrumpir con éxito el kernel

La interrupción todavía está rota. Tengo que reiniciar y recargar mis importaciones cada vez.

mismo problema en el laboratorio de jupyter en el kernel de Python 3.7

mismo problema en Jupyter Notebook y no puedo encontrar el proceso llamado conda.exe en el Administrador de tareas. ¿Alguna actualización de la solución todavía?

No es una solucion
A veces, intentar volver a conectarse al kernel ayuda en este caso

Observando lo mismo, en Windows 10

¿Alguien tuvo éxito en eso? Me estoy volviendo loco

Había un proceso llamado conda.exe en el Administrador de tareas. Maté ese proceso y pude interrumpir con éxito el kernel

@ahmedrao ¿Cómo ????

Este problema existe desde hace seis años y aún no tiene solución.

Este problema existe desde hace seis años y aún no tiene solución.

seis años sin ninguna solución, solo reinicia el kernel

Tener el mismo problema cada vez con más frecuencia, casi hasta el punto de que los portátiles se vuelven inutilizables, lo que es una verdadera lástima. En Anaconda 3.7 y las celdas simplemente se cuelgan con el asterisco, y no puedo interrumpir el kernel.

Marcar el mismo problema

Siempre he tenido este problema, especialmente con dbg y input.
Windows 10; Servidor portátil 5.7.8; Python 3.6.6 .; Conda 4.7.5
He aprendido que básicamente no puedo depurar cuadernos de forma confiable :(

sí, el problema aún existe. ¿Hay alguna forma de superar esto? ¡No quiero volver a ejecutar mi cuaderno, porque se tarda demasiado en llegar a donde estoy!

¡Hasta!
Este problema ha sido un dolor para mí durante años cada vez que uso pdb y me olvido de dejar de fumar antes de volver a ejecutar la celda.

Creé una recompensa en BountySource. Quizás esto finalmente se arregle si podemos reunir suficiente dinero.
https://www.bountysource.com/issues/44958889-hang-after-running-pdb-in-a-cell-kernel-interrupt-doesn-t-help

Para el problema del proceso específicamente, en Windows específicamente, aquí hay una teoría (aún no probada):

  1. El proceso se ejecuta a través de IPython.utils._process_win32.system , que llama a _system_body , que llama a p.wait() en el objeto subprocess.Popen .
  2. Windows subprocess.Popen.wait() tiene un problema conocido en el que no se puede interrumpir: https://bugs.python.org/issue28168

Si esa es la causa, cambiar a bucle ocupado cada 100 ms aproximadamente probablemente lo haría interrumpible, o si no, tomar el enfoque en el parche.

¡Gracias @Carreau!

¡Gracias @Carreau! ¿Cuándo llegará esto a una versión general? ¿Significa que entonces podremos utilizar el botón Interrumpir núcleo con éxito?

Probablemente haré un 7.13 mañana. Podría arreglar el botón de interrupción.

Hola @Carreau
Me enfrento a este problema cuando intento interrumpir una ejecución de celda en curso, la interrupción continúa para siempre y, por fin, tengo que reiniciar.

Entonces, para demostrar, como @wmayner sugirió una forma de replicar el problema. He adjuntado algunas capturas de pantalla para el mismo.
pyt1

Versiones de Jupyter en mi máquina.
pyt2

@ Arpit-Gole pdb es su propio problema específico; Espero arreglar eso pronto también: https://github.com/ipython/ipython/issues/10516

@itamarst Estoy entrenando un modelo de la siguiente manera:

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

Ahora sé que tomará tiempo según mi conjunto de datos. Pero digamos que por alguna razón elijo detener el procesamiento a la mitad presionando Kernel> Interrumpir Kernel .
Idealmente, debería interrumpir, pero tarda una eternidad en detenerse.
Ahora no quiero reiniciar porque todo mi progreso desaparecerá.

¡Por favor ayuda!

Si lo que está intentando interrumpir está implementado en C, entonces no hay nada que hacer. Depende de la biblioteca que use para manejar sigint.

A veces también me encuentro con esto ... Aquí hay un ejemplo reproducible del laboratorio de jupyer:

CARGAR DATOS

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')

Ejecutar búsqueda en cuadrícula: ESTO NO PUEDE SER INTERRUMPIDO

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

¿Algún consejo?

Me encontré con este problema tres veces esta tarde, me recuerda los buenos viejos tiempos cuando todavía usaba urllib.
Pensé que estaba en urllib, porque no hay respuesta a mi solicitud.
Estaba trabajando pero codificando, tengo que encontrar una solución pero una respuesta. Entonces almaceno cada variable en un archivo local.
Realmente no quiero que eso suceda una y otra vez.

Me enfrento al mismo problema cuando uso tensorflow y gpu para entrenar el modelo de aprendizaje profundo.

Se topa con esto con time.sleep y solicitudes.

También tengo este problema con las solicitudes time.sleep en Windows, pero funciona bien en Mac OS X

Tener este problema con ThreadPoolExecutor ... Algo como esto:

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)

La única forma de interrumpir es reiniciar el kernel ... muy frustrante

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

ericdill picture ericdill  ·  3Comentarios

alvations picture alvations  ·  4Comentarios

ghost picture ghost  ·  4Comentarios

RinaldoB picture RinaldoB  ·  3Comentarios

sataliulan picture sataliulan  ·  4Comentarios