Python 在主进程关闭后保持辅助进程运行

Python 在主进程关闭后保持辅助进程运行,python,windows,multiprocessing,Python,Windows,Multiprocessing,使用多处理库运行第二个进程,如何在关闭初始进程后保持该进程运行?我发誓它最初是这样做的,我必须启用守护进程选项,这样它才能正确关闭,但现在我似乎无法将它们分开 下面是一些有问题的简单代码。在主窗口上单击close也将关闭第二个进程,但据我所知,只有在daemon设置为True时才会发生这种情况 from multiprocessing import Process def background_process(): #So you can see it eating the cpu

使用
多处理
库运行第二个进程,如何在关闭初始进程后保持该进程运行?我发誓它最初是这样做的,我必须启用守护进程选项,这样它才能正确关闭,但现在我似乎无法将它们分开

下面是一些有问题的简单代码。在主窗口上单击close也将关闭第二个进程,但据我所知,只有在daemon设置为True时才会发生这种情况

from multiprocessing import Process

def background_process():

    #So you can see it eating the cpu
    while True:
        pass

if __name__ == '__main__':

    p = Process(target=background_process)
    p.daemon = False
    p.start()
我的目标是让脚本在所有平台上运行,因此,由于多处理部分是代码的一大块,我更希望它具有相当的通用性。

您可以简单地使用:

您可以使用、和(Unix套接字)进行通信


多处理。处理试图让你的生活更轻松,但很少做到。我建议您不要使用它。

谢谢,但它只适用于Unix系统。不幸的是,它在Windows上出现了一个
ImportError
。我正在使用多处理中的
Queue
,这非常有用,只是
Process
引起了很多麻烦:你使用windows 10吗?那么Python的Linux版本应该可以工作:@Peter:是的,Windows根本不能分叉。对fork()的Cygwin模拟非常激烈,但兼容性有限。为了公平起见,我正试图让它在所有操作系统上运行(有人已经让大部分linux版本正常工作了),所以最好还是将其留给默认的python安装吧哈哈。多处理模块可以工作,但我只是需要它不要立即退出,这有点烦人。如果您需要windows特定的答案,请始终使用“windows”标记您的任务。通常人们会认为你的目标是一个posix系统。啊,对了,谢谢,我从来没有想过。理想情况下,我希望它能在所有系统上运行,所以我尽量避免将主要部分特定于任何操作系统:)这两个进程都没有窗口。这两个进程都连接到一个控制台(conhost.exe),它们通过标准I/O使用该控制台。控制台拥有该窗口,并对其进行硬编码,以在关闭时终止连接到该窗口的所有进程。多处理自动终止所有守护进程,否则等待所有非守护进程退出。要绕过这个问题,您可以使用
os.\u exit(0)
,它会立即退出Python。要从控制台分离子进程,您应该首先将标准流复制到
nul
,例如
fd=os.open(os.devnull,os.O\u RDWR)
os.dup2(fd,sys.stdin.fileno())
os.dup2(fd,sys.stdout.fileno())
os.dup2(fd,sys.stderr.fileno())
操作系统关闭(fd)
。然后通过
ctypes.windell('kernel32').FreeConsole()
释放控制台句柄。现在可以关闭控制台,而不会终止后台进程。
from os import fork

child_pid = fork()
if child_pid == 0:
    '''This is the child process, i.e your background process'''
else:
    '''This is the parent process.'''