IPython:在后台异步运行命令

时间:2014-03-18 13:00:21

标签: python asynchronous ipython

假设我有一个 Python命令或脚本,我想在IPython会话期间在后台异步运行IPython。

我想从我的IPython会话中调用此命令,并在完成后收到通知,或者如果某些内容失败。我不希望这个命令阻止我的IPython提示。

是否有支持此功能的 IPython magics ?如果没有,在IPython上运行异步作业/脚本/命令(在本地运行)的推荐方法是什么?

例如,假设我有一个功能:

def do_something():
   # This will take a long time
   # ....
   return "Done"

我在当前的命名空间中。我怎样才能将它运行到后台并在完成后收到通知?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

是的,尝试(在单元格中):

%%script bash --bg --out script_out

sleep 10
echo hi!

script magic与其他IPython魔法一起被记录下来。这里必要的参数是-bg在后​​台(异步)而不是前台(同步)运行下面的脚本。

GitHub Issue #844现已解决。

答案 2 :(得分:3)

最常用的方法是使用Multiprocessing Module。这应该允许您在后台调用当前脚本中的函数(全新的过程)。

编辑 这可能不是最干净的方式,但应该完成工作。

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.