【问题标题】:How to launch a background process in Python with a delayed invocation?如何使用延迟调用在 Python 中启动后台进程?
【发布时间】:2010-02-03 16:35:46
【问题描述】:

好的,这是一个有点棘手的问题。我需要启动一个后台进程,它将(1)等待 N 秒,然后(2)执行一些命令。此外,我需要捕获后台进程本身的 pid,因为当父进程完成时,它会在必要时终止后台进程。在 shell 语法中看起来有点像这样:

  (sleep 15 && run_some_cmd) & # launch bg process
  bg_pid=$!                    # capture the bg pid
  # do some stuff here...     
  kill -9 $bg_pid              # and kill the bg_pid if necessary

这就是 shell 中的启动。但是,我正在尝试在 Python 中执行此操作。棘手的是,由于我需要捕获 bg pid,我不能使用 os.system() 或 os.fork(),因为在每种情况下,父进程都无法访问子进程的 pid。我试图让它与 subprocess.Popen() 一起工作,但考虑到“睡眠 15”部分,这有点棘手。

有什么想法吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    我不能使用 os.system() 或 os.fork(),因为在每种情况下父进程都无法访问子进程的 pid。

    呃,父进程从fork() 获取 pid 作为返回值。 无论如何,我建议使用subprocess 模块。它使您可以通过 Popen 对象的 pid 属性访问 pid。您可以使用os.kill() 函数向进程发送信号(杀死它)。

    最初,我添加了一条评论,大意是“子进程更可取,因为它适用于 windows 而 fork() 不适用”。这几乎立即被删除,因为当 subprocess 模块工作时, os.kill() 没有。但是,您也可以通过为 Windows 定义一个 kill 函数来解决此问题,正如 here 和 Alex Martelli 本人 here 所建议的(有点讽刺地)。所以现在我实际上可以声明 subprocess 具有更跨平台的优势,这让它有点酷。

    当然,如果您使用 Alex Martelli 对这个问题的回答,在 Windows 上运行的能力再次降低,因为您依赖于系统 shell 的功能(当然,cygwin 始终是一个选项)。

    【讨论】:

      【解决方案2】:

      当您将shell 作为True 提供给subprocess.Popen 时,您执行的命令可以与您在示例中直接在shell 中执行的命令相同,即(sleep 15 && run_some_cmd) 应该没问题。

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 2014-05-04
        • 2017-08-09
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        相关资源
        最近更新 更多