webentwicklung-frage-antwort-db.com.de

Gibt es eine Entsprechung zu STRG + C in IPython Notebook in Firefox, um laufende Zellen zu zerstören?

Ich habe angefangen, das IPython-Notizbuch zu verwenden und genieße es. Manchmal schreibe ich fehlerhaften Code, der sehr viel Speicher benötigt oder eine Endlosschleife hat. Ich finde die Option "Interrupt-Kernel" träge oder unzuverlässig, und manchmal muss ich den Kernel neu starten, wodurch alles im Speicher verloren geht.

Manchmal schreibe ich auch Skripte, die dazu führen, dass OS X nicht mehr genügend Arbeitsspeicher zur Verfügung steht, und ich muss einen harten Neustart durchführen. Ich bin mir nicht 100% sicher, aber wenn ich vorher solche Bugs geschrieben und Python im Terminal ausgeführt habe, kann ich das normalerweise CTRL+C meine Skripte.

Ich verwende die Anaconda-Distribution von IPython Notebook mit Firefox unter Mac OS X.

82
wwwilliam

Ich könnte mich irren, aber ich bin mir ziemlich sicher, dass der "Interrupt-Kernel" -Button nur ein SIGINT-Signal an den Code sendet, den Sie gerade ausführen (diese Idee wird von Fernandos Kommentar unterstützt hier ), Das ist das Gleiche, was das Drücken von STRG + C bewirken würde. Einige Prozesse in python behandeln SIGINTs abrupter als andere.

Wenn Sie dringend etwas stoppen müssen, das in iPython Notebook ausgeführt wird, und Sie iPython Notebook von einem Terminal aus gestartet haben, können Sie in diesem Terminal zweimal STRG + C drücken, um den gesamten iPython Notebook-Server zu unterbrechen. Dies stoppt iPython Notebook insgesamt, was bedeutet, dass es nicht möglich ist, Ihre Arbeit neu zu starten oder zu speichern. Dies ist offensichtlich keine großartige Lösung (Sie müssen zweimal STRG + C drücken, da dies eine Sicherheitsfunktion ist, die andere Benutzer nicht benötigen) versehentlich). Im Notfall wird der Prozess jedoch in der Regel schneller abgebrochen als mit der Schaltfläche "Kernel unterbrechen".

52
seaotternerd

Sie können zweimal I drücken, um den Kernel zu unterbrechen.

Dies funktioniert nur, wenn Sie sich im Befehlsmodus befinden. Wenn nicht bereits aktiviert, drücken Sie Esc um es zu aktivieren.

62
cutie

Um dies zu ergänzen: Wenn der Interrupt nicht funktioniert, können Sie den Kernel neu starten.

Gehe zum Kernel Dropdown >> restart >> restart und lösche die Ausgabe. Dies macht normalerweise den Trick. Wenn dies immer noch nicht funktioniert, beenden Sie den Kernel im Terminal (oder Task-Manager) und starten Sie ihn neu.

Interrupt funktioniert nicht bei allen Prozessen. Ich habe vor allem dieses Problem mit dem R-Kernel.

4
tomp

Hier sind Verknüpfungen für das IPython-Notizbuch.

Ctrl-m i unterbricht den Kernel. (das heißt, der einzige Buchstabe i nach Ctrl-m)

Laut this answer funktioniert I auch zweimal.

4
Skuli

[~ # ~] Update [~ # ~] : Verwandelte meine Lösung in ein eigenständiges python Skript.

Diese Lösung hat mich mehr als einmal gerettet. Hoffentlich finden es andere nützlich. Dieses python Skript findet jeden Jupyter-Kernel, der mehr als cpu_threshold CPU verwendet und fordert den Benutzer auf, ein SIGINT an den Kernel zu senden (KeyboardInterrupt) Senden von SIGINT, bis die CPU-Auslastung des Kernels unter cpu_threshold fällt.Wenn es mehrere fehlerhafte Kernel gibt, wird der Benutzer aufgefordert, jeden von ihnen zu unterbrechen (geordnet nach der höchsten CPU-Auslastung nach der niedrigsten) Gehen Sie zu gcbeltramini , um den Namen eines Jupyter-Kernels mithilfe der Jupyter-API zu finden. Dieses Skript wurde unter MACOS mit Python3 getestet und erfordert Jupyter Notebook, Requests, Json und Psutil.

Legen Sie das Skript in Ihr Home-Verzeichnis und die Verwendung sieht dann so aus:

python ~/interrupt_bad_kernels.py
Interrupt kernel chews cpu.ipynb; PID: 57588; CPU: 2.3%? (y/n) y

Skriptcode unten:

from os import getpid, kill
from time import sleep
import re
import signal

from notebook.notebookapp import list_running_servers
from requests import get
from requests.compat import urljoin
import ipykernel
import json
import psutil


def get_active_kernels(cpu_threshold):
    """Get a list of active jupyter kernels."""
    active_kernels = []
    pids = psutil.pids()
    my_pid = getpid()

    for pid in pids:
        if pid == my_pid:
            continue
        try:
            p = psutil.Process(pid)
            cmd = p.cmdline()
            for arg in cmd:
                if arg.count('ipykernel'):
                    cpu = p.cpu_percent(interval=0.1)
                    if cpu > cpu_threshold:
                        active_kernels.append((cpu, pid, cmd))
        except psutil.AccessDenied:
            continue
    return active_kernels


def interrupt_bad_notebooks(cpu_threshold=0.2):
    """Interrupt active jupyter kernels. Prompts the user for each kernel."""

    active_kernels = sorted(get_active_kernels(cpu_threshold), reverse=True)

    servers = list_running_servers()
    for ss in servers:
        response = get(urljoin(ss['url'].replace('localhost', '127.0.0.1'), 'api/sessions'),
                       params={'token': ss.get('token', '')})
        for nn in json.loads(response.text):
            for kernel in active_kernels:
                for arg in kernel[-1]:
                    if arg.count(nn['kernel']['id']):
                        pid = kernel[1]
                        cpu = kernel[0]
                        interrupt = input(
                            'Interrupt kernel {}; PID: {}; CPU: {}%? (y/n) '.format(nn['notebook']['path'], pid, cpu))
                        if interrupt.lower() == 'y':
                            p = psutil.Process(pid)
                            while p.cpu_percent(interval=0.1) > cpu_threshold:
                                kill(pid, signal.SIGINT)
                                sleep(0.5)

if __== '__main__':
    interrupt_bad_notebooks()
1
mbecker