假设我有一个 Python命令或脚本,我想在IPython会话期间在后台异步运行IPython。
我想从我的IPython会话中调用此命令,并在完成后收到通知,或者如果某些内容失败。我不希望这个命令阻止我的IPython提示。
是否有支持此功能的 IPython magics ?如果没有,在IPython上运行异步作业/脚本/命令(在本地运行)的推荐方法是什么?
例如,假设我有一个功能:
def do_something():
# This will take a long time
# ....
return "Done"
我在当前的命名空间中。我怎样才能将它运行到后台并在完成后收到通知?
答案 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.