开始一个单独的过程

Jac*_*esB 15 python multiprocessing

我想要一个脚本来启动一个新进程,以便在初始脚本退出后新进程继续运行.我希望我可以multiprocessing.Process用来启动一个新进程,并设置daemon=True为在创建的进程继续运行时主脚本可以退出.

但似乎第二个进程在主脚本退出时以静默方式终止.这是预期的行为,还是我做错了什么?

Jus*_*ini 14

从Python文档:

当进程退出时,它会尝试终止其所有守护进程子进程.

这是预期的行为.

  • 谢谢,显然我没有足够接近RTFM. (2认同)

unu*_*tbu 11

如果您使用的是unix系统,则可以使用os.fork:

import os
import time

pid=os.fork()
if pid:
    # parent
    while True:
        print("I'm the parent")
        time.sleep(0.5)    
else:
    # child
    while True:
        print("I'm just a child")
        time.sleep(0.5)
Run Code Online (Sandbox Code Playgroud)

运行它会创建两个进程.您可以在不杀死孩子的情况下杀死父母.例如,当您运行脚本时,您将看到如下内容:

% script.py
I'm the parent
I'm just a child
I'm the parent
I'm just a child
...
Run Code Online (Sandbox Code Playgroud)

使用ctrl-Z停止脚本:

^Z
[1]+  Stopped                 script.py
Run Code Online (Sandbox Code Playgroud)

查找父级的进程ID号.它是两个进程ID号中较小的一个,因为父对象是第一个:

% ps axuw | grep script.py
unutbu    6826  0.1  0.1  33792  6388 pts/24   T    15:09   0:00 python /home/unutbu/pybin/script.py
unutbu    6827  0.0  0.1  33792  4352 pts/24   T    15:09   0:00 python /home/unutbu/pybin/script.py
unutbu    6832  0.0  0.0  17472   952 pts/24   S+   15:09   0:00 grep --color=auto script.py
Run Code Online (Sandbox Code Playgroud)

杀死父进程:

% kill 6826
Run Code Online (Sandbox Code Playgroud)

将script.py恢复到前台:

% fg
script.py
Terminated
Run Code Online (Sandbox Code Playgroud)

您将看到子进程仍在运行:

% I'm just a child
I'm just a child
I'm just a child
...
Run Code Online (Sandbox Code Playgroud)

杀死孩子(在新的终端)

% kill 6827
Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 8

只需使用该subprocess模块:

import subprocess
subprocess.Popen(["sleep", "60"])
Run Code Online (Sandbox Code Playgroud)