В Jupyter с ядром ipython есть ли канонический способ выполнения ячеек неблокирующим образом?
В идеале я хотел бы иметь возможность запустить ячейку
%%background
time.sleep(10)
print("hello")
, чтобы я мог начать редактирование и запуск следующих ячеек и через 10 секунд увидеть «привет» в выводе исходной ячейки.
Я пробовал два подхода, но не былдоволен либо.
(1) Создать поток вручную:
def foo():
time.sleep(10)
print("hello")
threading.Thread(target=foo).start()
Проблема в том, что «привет» печатается в любой активной ячейке в течение 10 секунд, а не обязательно в той ячейке, гдепоток был запущен.
(2) Использовать виджет ipywidget.Output
.
def foo(out):
time.sleep(10)
out.append_stdout("hello")
out = ipywidgets.Output()
display(out)
threading.Thread(target=foo,args=(out,)).start()
Это работает, но возникают проблемы, когда я хочу обновить вывод (подумайте о мониторинге чего-то вроде потребления памяти):
def foo(out):
while True:
time.sleep(1)
out.clear_output()
out.append_stdout(str(datetime.datetime.now()))
out = ipywidgets.Output()
display(out)
threading.Thread(target=foo,args=(out,)).start()
Теперь вывод постоянно переключается между 0 и1 строка размера, что приводит к мерцанию всего ноутбука.
Это должно быть разрешено wait=True
при вызове clear_output
.Увы, для меня это приводит к тому, что вывод ничего не показывает.
Я мог бы спросить об этой проблеме, которая, в частности, является ошибкой, но я подумал, может быть, есть другое решение, которое не требует от меня всего этого вручную.