Firefox의 IPython Notebook에서 실행중인 셀을 끊는 CTRL + C와 동일한 기능이 있습니까?
저는 IPython 노트북을 사용하기 시작했고 즐기고 있습니다. 때로는 엄청난 메모리가 필요하거나 무한 루프가있는 버그가있는 코드를 작성합니다. "인터럽트 커널"옵션이 느리거나 불안정하다는 것을 알게되었고 때로는 커널을 다시 시작해야해서 메모리의 모든 것이 손실됩니다.
또한 가끔 OS X의 메모리 부족을 유발하는 스크립트를 작성하고 하드 재부팅을해야합니다. 100 % 확실하지는 않지만 이전에 이와 같은 버그를 작성하고 터미널에서 Python을 실행했을 때 일반적으로 CTRL+ C스크립트를 작성할 수 있습니다 .
Mac OS X에서 Firefox와 함께 IPython 노트북의 Anaconda 배포판을 사용하고 있습니다.
내가 틀렸을 수도 있지만, "interrupt kernel"버튼은 현재 실행중인 코드에 SIGINT 신호를 보내는 것으로 확신합니다 (이 아이디어는 여기 에있는 Fernando의 주석에 의해 지원됨 ). CTRL + C가 가능합니다. 파이썬 내의 일부 프로세스는 다른 프로세스보다 SIGINT를 더 갑작스럽게 처리합니다.
iPython Notebook에서 실행중인 것을 중단해야하고 터미널에서 iPython Notebook을 시작한 경우 해당 터미널에서 CTRL + C를 두 번 눌러 전체 iPython Notebook 서버를 중단 할 수 있습니다. 이렇게하면 iPython Notebook이 모두 중지됩니다. 즉, 작업을 다시 시작하거나 저장할 수 없기 때문에 이는 분명히 훌륭한 솔루션이 아닙니다 (안전 기능이므로 Ctrl + C를 두 번 눌러야합니다. 우연히하십시오). 그러나 긴급 상황의 경우 일반적으로 "커널 인터럽트"버튼보다 프로세스를 더 빨리 종료합니다.
I
두 번 눌러 커널을 중단 할 수 있습니다 .
이것은 명령 모드에있는 경우에만 작동합니다. 아직 활성화되지 않은 경우 활성화 Esc하려면 누릅니다 .
다음 은 IPython 노트북의 바로 가기입니다.
Ctrl-m i
커널을 중단합니다. (즉, 다음의 유일한 문자 i Ctrl-m
)
이 답변 에 따르면 I
두 번도 작동합니다.
위에 추가하려면 : 인터럽트가 작동하지 않으면 커널을 다시 시작할 수 있습니다.
커널 드롭 다운 >> 다시 시작 >> 다시 시작 및 출력 지우기로 이동합니다. 이것은 일반적으로 트릭을 수행합니다. 그래도 작동하지 않으면 터미널 (또는 작업 관리자)에서 커널을 종료 한 다음 다시 시작하십시오.
인터럽트는 모든 프로세스에서 잘 작동하지 않습니다. 특히 R 커널을 사용하면이 문제가 발생합니다.
업데이트 : 내 솔루션을 독립 실행 형 파이썬 스크립트로 바꿨습니다.
이 솔루션은 저를 두 번 이상 구했습니다. 다른 사람들이 유용하다고 생각하기를 바랍니다. 이 파이썬 스크립트는 cpu_threshold
CPU 이상을 사용하는 모든 jupyter 커널을 찾고 사용자에게 SIGINT
커널 (KeyboardInterrupt) 을 보내도록 프롬프트합니다 . SIGINT
커널의 CPU 사용량이 아래로 떨어질 때까지 계속 전송 합니다 cpu_threshold
. 오작동하는 커널이 여러 개있는 경우 각 커널을 중단하라는 메시지가 표시됩니다 (가장 높은 CPU 사용량에서 가장 낮은 커널 순으로 정렬 됨). jupyter api를 사용하여 jupyter 커널의 이름을 찾는 코드를 작성 해준 gcbeltramini 에게 큰 감사를드립니다 . 이 스크립트는 python3을 사용하는 MACOS에서 테스트되었으며 jupyter 노트북, 요청, 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()
A faster alternative will be to simply copy the localhost address, Ctrl C on cmd to stop the server, restart server then paste the address to a new tab.
'program story' 카테고리의 다른 글
자바 스크립트 '게양' (0) | 2020.09.22 |
---|---|
Angular-seed는 사실상 빈 프로젝트로 시작할까요? (0) | 2020.09.22 |
이름이 같은 네임 스페이스와 클래스? (0) | 2020.09.22 |
BigInteger의 .isProbablePrime ()의 가능한 사용 사례는 무엇입니까? (0) | 2020.09.22 |
ASP : CheckBox에 대한 OnClick 대 OnClientClick? (0) | 2020.09.22 |