Неблокирующее выполнение ячеек в Jupyter - PullRequest
1 голос
/ 03 апреля 2019

В 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.Увы, для меня это приводит к тому, что вывод ничего не показывает.

Я мог бы спросить об этой проблеме, которая, в частности, является ошибкой, но я подумал, может быть, есть другое решение, которое не требует от меня всего этого вручную.

1 Ответ

0 голосов
/ 04 апреля 2019

У меня возникли некоторые проблемы, подобные этой, при построении графика для вывода. Похоже, вы следовали примерам в документации по ipywidgets для асинхронных выходных виджетов.

Другой подход, который я нашел иногда полезным (особенно если вы знаете размер желаемого вывода), заключается в фиксировании высоты вашего выходного виджета при его создании.

out = ipywidgets.Output(layout=ipywidgets.Layout(height='25px'))

...