【问题标题】:IPython: Running commands asynchronously in the backgroundIPython:在后台异步运行命令
【发布时间】:2014-03-18 13:00:21
【问题描述】:

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

我想从我的 IPython 会话中调用这个命令,并在它完成时得到通知,或者如果出现故障。我不希望这个命令阻止我的 IPython 提示符。

是否有任何 IPython 魔法 支持这一点?如果没有,在 IPython 上运行异步作业/脚本/命令(在本地运行)的推荐方式是什么?

例如,假设我有一个函数:

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

我在当前命名空间中。如何将其运行到后台并在完成时收到通知?

【问题讨论】:

  • 它是独立的 Python 脚本(.py 文件)而不是当前导入模块的函数吗?在这种情况下,您可以使用 Python 子进程模块生成一个新的操作系统进程。
  • @MikkoOhtamaa 这是 Python 代码(命令和/或脚本)

标签: python asynchronous ipython


【解决方案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 bash --bg --out script_out
    
    sleep 10
    echo hi!
    

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

    GitHub Issue #844 现已解决。

    【讨论】:

    • 能否添加一些解释,例如文档链接?
    • @DawidFerenczy,这就是您要找的东西?
    • 是的,现在好多了,谢谢。我不是为了我自己,而是为了其他有同样问题的人。
    【解决方案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.
    

    【讨论】:

    • 谢谢!这是一个很好的指针。我认为multiprocessing 会有所帮助,我需要研究一下,有一个具体的简单示例真是太好了。上面p.join()的目的是什么?你知道 IPython 中的 %bg 魔法是不是基于这个模块?
    • p.join() 会一直阻塞,直到该过程完成 - 并非对您的确切需求有用,但对于示例是必需的。您需要管理连接,以确保您不会孤立其他进程。我过去使用过 iPython,但不知道它的魔力。
    猜你喜欢
    • 2019-10-31
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多