क्या फ़ायरफ़ॉक्स में चल रहे सेल को तोड़ने के लिए फ़ायरफ़ॉक्स में IPython नोटबुक में CTRL + C के बराबर है?


100

मैंने IPython नोटबुक का उपयोग करना शुरू कर दिया है और इसका आनंद ले रहा हूं। कभी-कभी, मैं छोटी गाड़ी कोड लिखता हूं जो बड़े पैमाने पर मेमोरी आवश्यकताओं को लेता है या जिसमें एक अनंत लूप होता है। मुझे "इंटरप्ट कर्नेल" विकल्प सुस्त या अविश्वसनीय लगता है, और कभी-कभी मुझे कर्नेल को फिर से शुरू करना पड़ता है, स्मृति में सब कुछ खो देता है।

मैं कभी-कभी स्क्रिप्ट भी लिखता हूं जिससे OS X मेमोरी से बाहर चला जाता है, और मुझे एक हार्ड रिबूट करना पड़ता है। मुझे शत-प्रतिशत यकीन नहीं है, लेकिन जब मैंने इस तरह के कीड़े लिखे हैं और टर्मिनल में पायथन को दौड़ाया है, तो मैं आमतौर पर अपनी लिपियों को CTRL+ कर सकता Cहूं।

मैं मैक ओएस एक्स पर फ़ायरफ़ॉक्स के साथ आईपीथॉन नोटबुक के एनाकोंडा वितरण का उपयोग कर रहा हूं।


1
मैं 0.13 (मैकओएसएक्स पर एनाकोंडा के लिए डिफ़ॉल्ट) में cntrl + mi शॉर्टकट या कर्नेल> अवरोध ड्रॉपडाउन के माध्यम से एक अनंत लूप को बाधित करने में कभी सफल नहीं रहा। समस्या 1.0 में तय हो गई है।
KLDavenport

जवाबों:


55

मैं गलत हो सकता हूं, लेकिन मुझे पूरा यकीन है कि "इंटरप्ट कर्नेल" बटन सिर्फ उस कोड को एक संकेत भेजता है जो आप वर्तमान में चला रहे हैं (यह विचार यहां फर्नांडो की टिप्पणी से समर्थित है , जो एक ही बात यह है कि हिटिंग है) CTRL + C करेगा। अजगर के भीतर कुछ प्रक्रिया दूसरों की तुलना में अचानक अधिक संभालती है।

यदि आपको iPython नोटबुक में चलने वाली किसी चीज़ को रोकने की सख्त आवश्यकता है और आपने टर्मिनल से iPython नोटबुक शुरू किया है, तो आप पूरे iPython नोटबुक सर्वर को बाधित करने के लिए CTRL + C को दो बार उस टर्मिनल में मार सकते हैं। यह iPython नोटबुक को पूरी तरह से रोक देगा, जिसका अर्थ है कि यह आपके काम को पुनः आरंभ या सहेजना संभव नहीं होगा, इसलिए यह स्पष्ट रूप से एक महान समाधान नहीं है (आपको CTRL + C को दो बार हिट करने की आवश्यकता है क्योंकि यह एक सुरक्षा सुविधा है ताकि लोग ऐसा न करें यह दुर्घटना से करो)। आपातकाल के मामले में, हालांकि, यह आमतौर पर "इंटरप्ट कर्नेल" बटन की तुलना में प्रक्रिया को अधिक तेजी से मारता है।


13
वैकल्पिक रूप से, आप IPython सर्वर को मारने से कम कठोर - बंद कर्नेल को पुनः आरंभ या बंद कर सकते हैं। यह Kernelड्रॉपडाउन से या नोटबुक सर्वर के पेज से ( Shutdownअपमानजनक नोटबुक के नाम के दाईं ओर बटन) से किया जा सकता है ।
drevicko

1
दुर्भाग्य से ऐसा लगता है कि ब्राउज़र इतना अनुत्तरदायी बन सकता है, कि सर्वर पेज तक पहुंचना कठिन है।
के-माइकल ऐ

क्या किसी प्रक्रिया को बाधित करने का कोई तरीका है jupyter-console? II / नियंत्रण-सी काम नहीं करता है। और कर्नेल को पुनरारंभ करने के लिए कोई अन्य शॉर्टकट नहीं है।
अल्फा_989

76

Iकर्नेल को बाधित करने के लिए आप दो बार दबा सकते हैं ।

यह तभी काम करता है जब आप कमांड मोड में हों। यदि पहले से सक्षम नहीं है, तो Escइसे सक्षम करने के लिए दबाएँ ।


क्या यह IPython के विशिष्ट संस्करण रेंज या किसी विशिष्ट OS के लिए है?
ग्रेग

6

यहाँ IPython नोटबुक के लिए शॉर्टकट हैं।

Ctrl-m iकर्नेल को बाधित करता है। (वह है, एकमात्र पत्र जिसके बाद मैं Ctrl-m)

इस उत्तर के अनुसार , Iदो बार भी काम करता है।


5

उपरोक्त जोड़ने के लिए: यदि व्यवधान काम नहीं कर रहा है, तो आप कर्नेल को पुनः आरंभ कर सकते हैं।

कर्नेल ड्रॉपडाउन पर जाएं >> रीस्टार्ट >> रीस्टार्ट और क्लियर आउटपुट। यह आमतौर पर चाल है। यदि यह अभी भी काम नहीं करता है, तो टर्मिनल (या कार्य प्रबंधक) में कर्नेल को मारें और फिर पुनरारंभ करें।

सभी प्रक्रियाओं के लिए इंटरप्ट अच्छा काम नहीं करता है। मैं विशेष रूप से आर कर्नेल का उपयोग कर इस समस्या है।


इस चाल ने मेरे लिए यह किया: 2 बिलियन प्रविष्टियों की बहु कोर किमी के क्लस्टरिंग (पहले से ज्ञात होना चाहिए) के कारण पूरी तरह से अनुत्तरदायी जुपिटर नोटबुक
एलेक्स

3

अद्यतन : मेरे समाधान को एक स्टैंड-अलोन अजगर स्क्रिप्ट में बदल दिया।

इस समाधान ने मुझे एक से अधिक बार बचाया है। उम्मीद है कि दूसरों को यह उपयोगी लगे। यह अजगर स्क्रिप्ट cpu_thresholdसीपीयू से अधिक का उपयोग करके किसी भी ज्यूपिटर कर्नेल को ढूंढ लेगी और उपयोगकर्ता को SIGINTकर्नेल ( कीबोर्डइंटरेरप्ट) को भेजने का संकेत देती है । यह SIGINTकर्नेल के सीपीयू उपयोग के नीचे जाने तक भेजता रहेगा cpu_threshold। यदि कई दुर्व्यवहार कर्नेल हैं, तो यह उपयोगकर्ता को उनमें से प्रत्येक को बाधित करने के लिए प्रेरित करेगा (सबसे कम सीपीयू उपयोग द्वारा निम्नतम क्रम में)। ज्यूपिटर एपीआई का उपयोग करके ज्यूपिटर कर्नेल का नाम खोजने के लिए कोड लिखने के लिए एक बड़ा धन्यवाद gcbeltramini जाता है । इस स्क्रिप्ट को python3 के साथ MACOS पर परीक्षण किया गया था और इसके लिए ज्यूपिटर नोटबुक, अनुरोध, json और psutil की आवश्यकता होती है।

स्क्रिप्ट को अपने होम डायरेक्टरी में रखें और फिर उपयोग जैसा दिखता है:

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

नीचे स्क्रिप्ट कोड:

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 __name__ == '__main__':
    interrupt_bad_notebooks()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.