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 разрешена.