Firefox'ta IPython Notebook'ta çalışan hücreleri kırmak için CTRL + C'ye bir eşdeğeri var mı?


103

IPython Not Defterini kullanmaya başladım ve keyif alıyorum. Bazen, büyük bellek gereksinimleri gerektiren veya sonsuz döngüye sahip hatalı kodlar yazıyorum. "Çekirdeği kesme" seçeneğini yavaş veya güvenilmez buluyorum ve bazen çekirdeği yeniden başlatmam gerekiyor, bellekteki her şeyi kaybediyorum.

Ayrıca bazen OS X'in belleğinin bitmesine neden olan komut dosyaları yazıyorum ve sert bir yeniden başlatma yapmam gerekiyor. % 100 emin değilim, ancak daha önce böyle hatalar yazıp terminalde Python çalıştırdığımda, genellikle komut dosyalarımı CTRL+ yapabilirim C.

Mac OS X üzerinde Firefox ile IPython dizüstü bilgisayarın Anaconda dağıtımını kullanıyorum.


1
Cntrl + mi kısayolu veya 0.13'te çekirdek> kesinti açılır menüsü (MacOSX'te anaconda için varsayılan) aracılığıyla sonsuz bir döngüyü kesintiye uğratmada hiçbir zaman başarılı olamadım. Sorun 1.0'da çözülmüş gibi görünüyor.
KLDavenport

Yanıtlar:


58

Yanılıyor olabilirim, ancak "çekirdeği kes" düğmesinin şu anda çalıştırmakta olduğunuz koda yalnızca bir SIGINT sinyali göndereceğinden oldukça eminim (bu fikir, buradaki Fernando'nun yorumu tarafından desteklenmektedir ), bu da vurmakla aynı şeydir. CTRL + C yapardı. Python içindeki bazı süreçler SIGINT'leri diğerlerinden daha aniden işler.

İPython Notebook'ta çalışan bir şeyi umutsuzca durdurmanız gerekiyorsa ve iPython Notebook'u bir terminalden başlattıysanız, tüm iPython Notebook sunucusunu kesmek için o terminalde CTRL + C'ye iki kez basabilirsiniz. Bu, iPython Dizüstü Bilgisayarı tamamen durduracaktır, bu da çalışmanızı yeniden başlatmanın veya kaydetmenin mümkün olmayacağı anlamına gelir, bu nedenle bu kesinlikle harika bir çözüm değildir (CTRL + C'ye iki kez basmanız gerekir çünkü bu bir güvenlik özelliği olduğundan insanlar kazara yap). Ancak acil durumlarda, genellikle süreci "çekirdeği kes" düğmesinden daha hızlı sonlandırır.


13
Alternatif olarak, rahatsız edici çekirdeği yeniden başlatabilir veya durdurabilirsiniz - ipython sunucusunu öldürmekten daha az serttir. Bu, Kernelaçılır menüden veya dizüstü bilgisayar sunucusunun sayfasından (sorun Shutdownteşkil eden not defterinin adının sağındaki düğme) yapılabilir.
drevicko

1
Ne yazık ki, tarayıcı o kadar tepkisiz hale gelebiliyor ki, sunucu sayfasına ulaşmak zor.
K.-Michael Aye

Bir süreci kesintiye uğratmanın bir yolu var mı jupyter-console? II / control-c çalışmıyor. Ve çekirdeği yeniden başlatmak için başka bir kısayol yok.
alpha_989

79

IÇekirdeği kesmek için iki kez basabilirsiniz .

Bu yalnızca Komut modundaysanız çalışır. Henüz etkinleştirilmemişse, Escetkinleştirmek için basın .


Bu, belirli bir IPython sürüm aralığı veya belirli bir işletim sistemi için mi?
Greg

Beni 20 dakika kurtardın, teşekkür ederim yabancı
sapo_cosmico

6

IPython Not Defteri için kısayollar burada .

Ctrl-m içekirdeği kesintiye uğratır. (yani, sonrasındaki tek harf i Ctrl-m)

Bu cevaba göre Iiki kez de işe yarıyor.


5

Yukarıdakilere eklemek için: Kesme çalışmıyorsa, çekirdeği yeniden başlatabilirsiniz.

Çekirdek açılır menüsüne gidin >> yeniden başlat >> yeniden başlat ve çıktıyı temizle. Bu genellikle işe yarar. Bu hala işe yaramazsa, terminaldeki (veya görev yöneticisindeki) çekirdeği öldürün ve ardından yeniden başlatın.

Interrupt tüm süreçler için iyi çalışmaz. Özellikle R çekirdeğini kullanırken bu sorunu yaşıyorum.


Bu numara benim için yaptı: 2 Milyar girişin çok çekirdekli kümelenmesi nedeniyle tamamen yanıt vermeyen Jupyter Notebook (daha önce bilinmesi gerekirdi)
Alex

4

GÜNCELLEME : Çözümümü bağımsız bir python betiğine dönüştürdüm.

Bu çözüm beni bir kereden fazla kurtardı. Umarım diğerleri onu yararlı bulur. Bu python betiği, CPU'dan daha fazlasını kullanan herhangi bir jupyter çekirdeğini bulur cpu_thresholdve kullanıcıdan SIGINTçekirdeğe (KeyboardInterrupt) bir tane göndermesini ister . SIGINTÇekirdeğin cpu kullanımı aşağı inene kadar göndermeye devam edecektir cpu_threshold. Birden fazla hatalı çalışan çekirdek varsa, kullanıcıdan her birini kesmesini isteyecektir (en yüksek CPU kullanımına göre en düşük seviyeye doğru sıralanır). Jupyter api'sini kullanarak bir jupyter çekirdeğinin adını bulmak için kod yazdığı için gcbeltramini'ye çok teşekkür ederiz . Bu betik, MACOS üzerinde python3 ile test edilmiştir ve jupyter not defteri, istek, json ve psutil gerektirir.

Komut dosyasını ana dizininize koyun ve ardından kullanım şöyle görünür:

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

Aşağıdaki komut dosyası kodu:

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()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.