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

如何在Python中启动独立运行的子进程,并在主进程关闭时继续运行?,python,flask,subprocess,Python,Flask,Subprocess,我有一个小的FlaskAPI,它接收来自远程服务器的请求。无论何时收到请求,都会启动子流程。此子流程只是执行同一文件夹中的第二个Python文件。此子流程可以运行几个小时,其中几个子流程可以同时运行。我使用stdout将python文件的输出写入文本文件 所有这些都可以正常工作,但每隔几周,FlaskAPI就会失去响应,需要重新启动。一旦我停止Flask服务器,所有正在运行的子进程都将停止。我希望避免这种情况,并独立于FlaskAPI运行每个子流程 这是一个小例子,说明了我在做什么(这段代码基本

我有一个小的FlaskAPI,它接收来自远程服务器的请求。无论何时收到请求,都会启动子流程。此子流程只是执行同一文件夹中的第二个Python文件。此子流程可以运行几个小时,其中几个子流程可以同时运行。我使用stdout将python文件的输出写入文本文件

所有这些都可以正常工作,但每隔几周,FlaskAPI就会失去响应,需要重新启动。一旦我停止Flask服务器,所有正在运行的子进程都将停止。我希望避免这种情况,并独立于FlaskAPI运行每个子流程

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

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


任何帮助都将不胜感激。

重新启动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服务器进程的影响。

使用fork()创建调用此函数的进程的子进程。在fork()成功时,它将为子id返回零

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

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

希望这有帮助

浏览有一个
creationflags
如果设置为
子流程。CREATE_NEW_CONSOLE
新流程有一个新控制台,而不是继承其父进程的控制台(默认)。不确定这是否是您要找的。谢谢。这似乎可以在Linux上运行,但不幸的是,此flask服务器运行在windows服务器上(它依赖于Linux上不可用的某些软件)。原来os.fork方法只能在Linux上使用。谢谢。这似乎非常接近我想要的。当Flask服务器关闭时,该过程确实会继续。但是,此调用之后,flask服务器中的方法不会继续。我尝试在一个单独的线程中执行此操作,如下所示:
def start_job():command='cmd/c“python job.py>log.txt”'subprocess.call(command,shell=True,cwd=“jobs/jobid/”)thread=threading.thread(target=start_job,args=[])thread.start()
,它解决了方法继续的问题,但当我现在关闭Flask服务器时,进程再次终止。据我所知,您需要将您的子进程与主Flask进程完全分离,对吗?我建议您将整个子流程调用包含在一个Python文件中,并从新shell中编写和执行该文件。如果您编写了一个新的Python文件,其中包含了需要运行的所有必要方法,那么您实际上并不需要线程。每个新的终端shell调用本质上都是一个新线程,因为它位于自己的shell中。这有意义吗?我很高兴这有帮助。如果你发现我的答案/评论有帮助,请考虑投票给他们,谢谢!
import os
pid = os.fork()
if pid == 0:  # new process
    os.system("nohup python ./job.py &")