IPython: запуск команд асинхронно в фоновом режиме
Скажем, у меня есть команда Python или script, которую я хочу запускать из IPython асинхронно, в фоновом режиме, во время сеанса IPython.
Я хотел бы вызвать эту команду из своего сеанса IPython и получить уведомление, когда это будет сделано, или если что-то не удастся. Я не хочу, чтобы эта команда блокировала мою подсказку IPython.
Есть ли магия IPython, поддерживающая это? Если нет, то каков рекомендуемый способ запуска асинхронных заданий/скриптов/команд (выполняемых локально) на IPython?
Например, скажем, у меня есть функция:
def do_something():
# This will take a long time
# ....
return "Done"
который у меня есть в текущем пространстве имен. Как я могу запустить его на задний план и получить уведомление, когда это будет сделано?
Ответы
Ответ 1
В iPython была волшебная функция, которая позволила бы вам сделать именно это:
https://github.com/ipython/ipython/wiki/Cookbook:-Running-a-file-in-the-background
Однако кажется, что он был удален и все еще ожидает возврата в более новые версии:
https://github.com/ipython/ipython/issues/844
Он по-прежнему предоставляет библиотеку, чтобы помочь вам в ее достижении:
http://ipython.org/ipython-doc/rel-0.10.2/html/api/generated/IPython.background_jobs.html
Ответ 2
Самый общий способ - использовать Модуль многопроцессорности. Это должно позволить вам вызывать функции в текущем script в фоновом режиме (полностью новый процесс).
Изменить Это может быть не самый чистый способ, но выполнить эту работу.
import time
from multiprocessing import Process, Pipe
ALONGTIME = 3
def do_something(mpPipe):
# This will take a long time
print "Do_Something_Started"
time.sleep(ALONGTIME)
print "Do_Something_Complete"
mpPipe.send("Done")
if __name__ == "__main__":
parent_conn, child_conn = Pipe()
p = Process(target=do_something, args=(child_conn,))
p.start()
p.join() # block until the process is complete - this should be pushed to the end of your script / managed differently to keep it async :)
print parent_conn.recv() # will tell you when its done.
Ответ 3
Да, попробуйте (в ячейке):
%%script bash --bg --out script_out
sleep 10
echo hi!
script magic документируется вместе с другими магиями IPython. Необходимым аргументом здесь является -bg
для запуска ниже script в фоновом режиме (асинхронно) вместо переднего плана (синхронно).
Проблема GitHub № 844 разрешена.