我有一个小的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参数,但是即使删除了这些参数,其行为也保持不变。
任何帮助将不胜感激。
答案 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 &")
希望这会有所帮助!