มี CTRL + C เทียบเท่ากับ IPython Notebook ใน Firefox เพื่อทำลายเซลล์ที่กำลังทำงานอยู่หรือไม่?


103

ฉันเริ่มใช้ IPython Notebook และสนุกกับมัน บางครั้งฉันเขียนโค้ดบั๊กกี้ที่ต้องใช้หน่วยความจำจำนวนมากหรือมีการวนซ้ำที่ไม่สิ้นสุด ฉันพบว่าตัวเลือก "ขัดจังหวะเคอร์เนล" ทำงานช้าหรือไม่น่าเชื่อถือและบางครั้งฉันต้องรีสตาร์ทเคอร์เนลสูญเสียทุกอย่างในหน่วยความจำ

บางครั้งฉันก็เขียนสคริปต์ที่ทำให้ OS X มีหน่วยความจำไม่เพียงพอและฉันต้องทำการรีบูตอย่างหนัก ฉันไม่แน่ใจ 100% แต่เมื่อฉันเคยเขียนข้อบกพร่องแบบนี้มาก่อนและเรียกใช้ Python ในเทอร์มินัลฉันมักจะสามารถCTRL+ Cสคริปต์ของฉันได้

ฉันใช้โน้ตบุ๊ก IPython ที่แจกจ่าย Anaconda กับ Firefox บน Mac OS X


1
ฉันไม่เคยประสบความสำเร็จในการขัดจังหวะการวนซ้ำแบบไม่มีที่สิ้นสุดผ่านทางลัด cntrl + mi หรือเคอร์เนล> อินเตอร์รัปต์ดรอปดาวน์ใน 0.13 (ค่าเริ่มต้นสำหรับ anaconda บน MacOSX) ดูเหมือนว่าปัญหาจะได้รับการแก้ไขแล้วใน 1.0
KLDavenport

คำตอบ:


58

ฉันอาจจะผิด แต่ฉันค่อนข้างแน่ใจว่าปุ่ม "ขัดจังหวะเคอร์เนล" เพียงแค่ส่งสัญญาณ SIGINT ไปยังโค้ดที่คุณกำลังใช้งานอยู่ (แนวคิดนี้ได้รับการสนับสนุนโดยความคิดเห็นของ Fernando ที่นี่ ) ซึ่งเป็นสิ่งเดียวกับการกดปุ่ม CTRL + C จะทำ กระบวนการบางอย่างภายใน python จัดการ SIGINT ได้เร็วกว่ากระบวนการอื่น ๆ

หากคุณจำเป็นต้องหยุดบางสิ่งที่กำลังทำงานใน iPython Notebook และคุณเริ่มต้น iPython Notebook จากเครื่องเทอร์มินัลคุณสามารถกด CTRL + C สองครั้งในเทอร์มินัลนั้นเพื่อขัดจังหวะเซิร์ฟเวอร์ iPython Notebook ทั้งหมด สิ่งนี้จะหยุด iPython Notebook ทั้งหมดซึ่งหมายความว่าจะไม่สามารถรีสตาร์ทหรือบันทึกงานของคุณได้ดังนั้นนี่จึงไม่ใช่วิธีแก้ปัญหาที่ยอดเยี่ยม (คุณต้องกด CTRL + C สองครั้งเนื่องจากเป็นคุณสมบัติด้านความปลอดภัยเพื่อไม่ให้คนอื่น ๆ ทำโดยบังเอิญ) อย่างไรก็ตามในกรณีฉุกเฉินโดยทั่วไปจะฆ่ากระบวนการได้เร็วกว่าปุ่ม "ขัดจังหวะเคอร์เนล"


13
หรือคุณสามารถรีสตาร์ทหรือหยุดเคอร์เนลที่ละเมิดซึ่งน้อยกว่าการฆ่าเซิร์ฟเวอร์ ipython สามารถทำได้จากKernelดรอปดาวน์หรือจากหน้าเซิร์ฟเวอร์โน้ตบุ๊ก ( Shutdownปุ่มทางด้านขวาของชื่อโน้ตบุ๊กที่กระทำผิด)
drevicko

1
น่าเสียดายที่ดูเหมือนว่าเบราว์เซอร์จะไม่ตอบสนองมากจนเข้าถึงหน้าเซิร์ฟเวอร์ได้ยาก
K. -Michael Aye

มีวิธีขัดจังหวะกระบวนการjupyter-consoleหรือไม่? II / control-c ไม่ทำงาน และไม่มีทางลัดอื่นในการรีสตาร์ทเคอร์เนล
alpha_989

79

คุณสามารถกดIสองครั้งเพื่อขัดจังหวะเคอร์เนล

สิ่งนี้ใช้ได้เฉพาะเมื่อคุณอยู่ในโหมดคำสั่ง หากยังไม่ได้เปิดใช้งานให้กดEscเพื่อเปิดใช้งาน


นี่เป็นช่วงเวอร์ชันเฉพาะของ IPython หรือ OS เฉพาะหรือไม่
Greg

คุณช่วยฉันไว้แค่ 20 นาทีขอบคุณคนแปลกหน้า
sapo_cosmico

6

นี่เป็นทางลัดสำหรับโน๊ตบุ๊ค IPython

Ctrl-m iขัดจังหวะเคอร์เนล (นั่นคือตัวอักษรเดียวที่ฉันตามหลังCtrl-m)

ตามคำตอบนี้Iสองครั้งได้ผลเช่นกัน


5

หากต้องการเพิ่มด้านบน: หากการขัดจังหวะไม่ทำงานคุณสามารถรีสตาร์ทเคอร์เนลได้

ไปที่เคอร์เนลดรอปดาวน์ >> รีสตาร์ท >> รีสตาร์ทและล้างผลลัพธ์ ซึ่งมักจะเป็นเคล็ดลับ หากยังไม่ได้ผลให้ฆ่าเคอร์เนลในเทอร์มินัล (หรือตัวจัดการงาน) แล้วรีสตาร์ท

การขัดจังหวะไม่ได้ผลดีสำหรับทุกกระบวนการ ฉันมีปัญหานี้โดยเฉพาะเมื่อใช้เคอร์เนล R


เคล็ดลับนี้ทำเพื่อฉัน: โน้ตบุ๊ก Jupyter ที่ไม่ตอบสนองโดยสิ้นเชิงเนื่องจากกม. หลายคอร์รวมกลุ่ม 2 พันล้านรายการ (ควรจะรู้มาก่อน)
Alex

4

UPDATE : เปลี่ยนโซลูชันของฉันให้เป็นสคริปต์ Python แบบสแตนด์อโลน

วิธีนี้ช่วยฉันได้มากกว่าหนึ่งครั้ง หวังว่าคนอื่นจะพบว่ามีประโยชน์ สคริปต์ python นี้จะค้นหาเคอร์เนล jupyter ที่ใช้มากกว่าcpu_thresholdCPU และแจ้งให้ผู้ใช้ส่ง a SIGINTไปยังเคอร์เนล (KeyboardInterrupt) มันจะทำให้การส่งจนกว่าจะใช้ซีพียูเคอร์เนลของไปด้านล่างSIGINT cpu_thresholdหากมีเมล็ดที่ทำงานผิดปกติหลายเมล็ดจะแจ้งให้ผู้ใช้ขัดจังหวะแต่ละเมล็ด (เรียงลำดับตามการใช้งาน CPU สูงสุดไปยังต่ำสุด) ขอบคุณมากสำหรับgcbeltraminiสำหรับการเขียนโค้ดเพื่อค้นหาชื่อของเคอร์เนล jupyter โดยใช้ jupyter api สคริปต์นี้ได้รับการทดสอบบน MACOS ด้วย python3 และต้องใช้สมุดบันทึก jupyter, request, 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()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.