如何在Python中启动独立运行的子进程,并在主进程关闭的情况下继续运行?

时间:2019-05-07 08:57:07

标签: python flask subprocess

我有一个小的Flask API,该API正在接收来自远程服务器的请求。每当收到请求时,就会启动一个子过程。该子过程只是在执行同一文件夹中的第二个Python文件。该子流程可以运行几个小时,并且其中几个子流程可以同时运行。我正在使用stdout将python文件的输出写入文本文件。

所有这些都工作正常,但是每两周就会发生Flask API变得无响应且需要重新启动的情况。一旦我停止Flask服务器,所有正在运行的子进程就会停止。我想避免这种情况,并独立于flask API运行每个子流程。

这是一个说明我正在做什么的小例子(此代码基本上在可以通过API调用的方法中)

import subprocess

f = open("log.txt","wb")
subprocess.Popen(["python","job.py"],cwd = "./", stdout = f, stderr = f)

我希望在停止Flask API之后子进程继续运行。目前情况并非如此。我在其他地方看到的原因是我正在使用stdout和stderr参数,但是即使删除了这些参数,其行为也保持不变。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您的子流程停止,因为当您重新启动Flask服务器时,其子流程已死。您需要通过在新的shell中运行Python调用,将子流程与Flask流程完全分开:

from subprocess import call

# On Linux:
command = 'gnome-terminal -x bash -l -c "python job.py"'
# On Windows:
# command = 'cmd /c "python job.py"'
call(command, shell=True)

通过这种方式,您对Python的job.py调用将在单独的终端窗口中运行,不受Flask服务器进程的影响。

答案 1 :(得分:0)

使用fork()创建您要在其中调用此函数的进程的子进程。成功执行fork()时,它将为子ID返回零。

下面是fork的基本示例,您可以轻松地将其合并到代码中。

import os
pid = os.fork()
if pid == 0:  # new process
    os.system("nohup python ./job.py &")

希望这会有所帮助!