Có tương đương với CTRL + C trong IPython Notebook trong Firefox để ngắt các ô đang chạy không?


100

Tôi đã bắt đầu sử dụng IPython Notebook và rất thích nó. Đôi khi, tôi viết mã lỗi yêu cầu bộ nhớ lớn hoặc có vòng lặp vô hạn. Tôi thấy tùy chọn "hạt nhân ngắt" chậm chạp hoặc không đáng tin cậy, và đôi khi tôi phải khởi động lại hạt nhân, làm mất mọi thứ trong bộ nhớ.

Đôi khi tôi cũng viết các tập lệnh khiến OS X hết bộ nhớ và tôi phải khởi động lại khó. Tôi không chắc chắn 100%, nhưng khi tôi đã viết các lỗi như thế này trước đây và chạy Python trong thiết bị đầu cuối, tôi thường có thể CTRL+ Ccác tập lệnh của mình.

Tôi đang sử dụng bản phân phối Anaconda của sổ ghi chép IPython với Firefox trên Mac OS X.


1
Tôi chưa bao giờ thành công trong việc ngắt một vòng lặp vô hạn thông qua phím tắt cntrl + mi hoặc nhân> trình đơn thả xuống ngắt trong 0.13 (mặc định cho anaconda trên MacOSX). Vấn đề dường như đã được khắc phục trong 1.0.
KLDavenport

Câu trả lời:


55

Tôi có thể sai, nhưng tôi khá chắc chắn rằng nút "hạt nhân ngắt" chỉ gửi tín hiệu SIGINT đến mã mà bạn hiện đang chạy (ý tưởng này được hỗ trợ bởi nhận xét của Fernando ở đây ), điều này giống với việc nhấn CTRL + C sẽ làm được. Một số quy trình trong python xử lý SIGINT đột ngột hơn những quy trình khác.

Nếu bạn thực sự cần dừng một cái gì đó đang chạy trong iPython Notebook và bạn đã khởi động iPython Notebook từ một thiết bị đầu cuối, bạn có thể nhấn CTRL + C hai lần trong thiết bị đầu cuối đó để ngắt toàn bộ máy chủ iPython Notebook. Điều này sẽ dừng hoàn toàn iPython Notebook, có nghĩa là không thể khởi động lại hoặc lưu công việc của bạn, vì vậy đây rõ ràng không phải là một giải pháp tuyệt vời (bạn cần nhấn CTRL + C hai lần vì đây là một tính năng an toàn để mọi người không làm điều đó một cách tình cờ). Tuy nhiên, trong trường hợp khẩn cấp, nó thường giết quá trình nhanh hơn so với nút "hạt nhân ngắt".


13
Ngoài ra, bạn có thể khởi động lại hoặc dừng hạt nhân vi phạm - ít nghiêm trọng hơn là giết máy chủ ipython. Điều này có thể được thực hiện từ trình đơn Kernelthả xuống hoặc từ trang của máy chủ sổ ghi chép ( Shutdownnút ở bên phải tên của sổ ghi chép vi phạm).
drevicko

1
Thật không may, có vẻ như trình duyệt có thể không phản hồi đến mức khó có thể truy cập trang máy chủ.
K.-Michael Aye

Có cách nào để làm gián đoạn quá trình trong jupyter-consolekhông? II / control-c không hoạt động. Và không có phím tắt nào khác để khởi động lại hạt nhân.
alpha_989

75

Bạn có thể nhấn Ihai lần để ngắt nhân.

Điều này chỉ hoạt động nếu bạn đang ở chế độ Lệnh. Nếu chưa được bật, hãy nhấn Escđể bật nó.


Điều này dành cho một phạm vi phiên bản cụ thể của IPython hay một hệ điều hành cụ thể?
Greg

6

Dưới đây là các phím tắt cho IPython Notebook.

Ctrl-m ingắt hạt nhân. (nghĩa là, chữ tôi duy nhất đứng sau Ctrl-m)

Theo câu trả lời này , Ihai lần cũng hoạt động.


5

Để thêm vào những điều trên: Nếu ngắt không hoạt động, bạn có thể khởi động lại hạt nhân.

Đi tới trình đơn thả xuống hạt nhân >> khởi động lại >> khởi động lại và xóa đầu ra. Điều này thường thực hiện thủ thuật. Nếu điều này vẫn không hoạt động, hãy giết hạt nhân trong thiết bị đầu cuối (hoặc trình quản lý tác vụ) và sau đó khởi động lại.

Ngắt không hoạt động tốt cho tất cả các quy trình. Tôi đặc biệt gặp sự cố này khi sử dụng hạt nhân R.


Thủ thuật này đã làm điều đó cho tôi: Máy tính xách tay Jupyter hoàn toàn không phản hồi do nhóm kmeans đa lõi gồm 2 Tỷ mục nhập (lẽ ra phải biết trước)
Alex

3

CẬP NHẬT : Đã biến giải pháp của tôi thành một tập lệnh python độc lập.

Giải pháp này đã nhiều lần cứu tôi. Hy vọng rằng những người khác thấy nó hữu ích. Tập lệnh python này sẽ tìm thấy bất kỳ hạt nhân jupyter nào sử dụng nhiều hơn cpu_thresholdCPU và nhắc người dùng gửi một SIGINThạt nhân (KeyboardInterrupt). Nó sẽ tiếp tục gửi SIGINTcho đến khi mức sử dụng cpu của nhân ở bên dưới cpu_threshold. Nếu có nhiều nhân hoạt động sai, nó sẽ nhắc người dùng ngắt từng nhân (sắp xếp theo mức sử dụng CPU cao nhất đến thấp nhất). Xin gửi lời cảm ơn sâu sắc tới gcbeltramini vì đã viết mã để tìm tên của nhân jupyter bằng cách sử dụng jupyter api. Tập lệnh này đã được thử nghiệm trên MACOS với python3 và yêu cầu sổ ghi chép jupyter, yêu cầu, json và psutil.

Đặt tập lệnh vào thư mục chính của bạn và sau đó cách sử dụng sẽ giống như sau:

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

Mã tập lệnh bên dưới:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.