【问题标题】:Python - Launch a Long Running Process from a Web AppPython - 从 Web 应用程序启动长时间运行的进程
【发布时间】:2011-02-27 13:00:37
【问题描述】:

我有一个 python web 应用程序需要启动一个长时间运行的进程。问题是我不希望它等待该过程完成。只需启动并完成。

我在 Windows XP 上运行,而 Web 应用程序在 IIS 下运行(如果这很重要的话)。

到目前为止,我尝试了 popen,但这似乎不起作用。它一直等到子进程完成。

【问题讨论】:

标签: python windows winapi popen long-running-processes


【解决方案1】:

好的,我终于想通了!这似乎有效:

from subprocess import Popen
from win32process import DETACHED_PROCESS

pid = Popen(["C:\python24\python.exe", "long_run.py"],creationflags=DETACHED_PROCESS,shell=True).pid
print pid
print 'done' 
#I can now close the console or anything I want and long_run.py continues!

注意:我添加了 shell=True。否则在子进程中调用 print 会给我错误“IOError: [Errno 9] Bad file descriptor”

DETACHED_PROCESS 是一个Process Creation Flag,它被传递给底层的 WINAPI CreateProcess 函数。

【讨论】:

  • 知道如何在 Unix 上执行此操作吗?
  • Unix 上似乎不需要这个标志
  • 我不需要 shell=True 来工作。错误的文件描述符错误可能无关。
【解决方案2】:

这几乎可以正常工作 (from here):

from subprocess import Popen

pid = Popen(["C:\python24\python.exe", "long_run.py"]).pid
print pid
print 'done'

'done' 将立即被打印出来。问题是上面的进程一直运行直到 long_run.py 返回,如果我关闭该进程,它会杀死 long_run.py 的进程。

当然有一些方法可以使进程完全独立于父进程。

【讨论】:

    【解决方案3】:

    您可以将作业写入消息队列,而不是直接从您的 web 应用程序启动进程。一个单独的服务从消息队列中读取并运行作业。看看Celery,一个用 Python 编写的分布式任务队列。

    【讨论】:

      【解决方案4】:

      subprocess.Popen 会这样做。

      【讨论】:

      • 你知道我会怎么称呼它吗?当我尝试它时,它一直等到长时间运行的过程完成。也许我说错了。
      • 您不能等待应用程序输出或终止:)
      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多