该进程是否使用真正的守护进程python`mutliprocessing.Process()。daemon = True`创建?

时间:2018-09-05 07:14:51

标签: python python-3.x multithreading multiprocessing

我编写了一个服务器,该服务器在特定端口上接受请求,并派生一个新的守护程序来处理每个请求。我正在与multiprocessing module分叉。基本代码(没有端口监听逻辑,这不是我的疑问)看起来像这样:

代码(mu_min.py)

import time
import multiprocessing as mup
import sys
import os

def worker(name):
    a = 0

    while(a < 5):
        print(name,":",a)
        a = a+1
        time.sleep(2)
        pass 

    print("Exiting worker: ", name, "(", os.getpid(), ")")

def start_server():
    b = 0

    while(b<3):
        new_worker = mup.Process(target=worker,args=('worker-'+str(b),))
        new_worker.daemon = True
        new_worker.start()
        b = b + 1
        time.sleep(3)

    time.sleep(3600)

start_server()

输出

worker-0 : 0
worker-0 : 1
worker-0 : 2
worker-0 : 3
worker-0 : 4
Exiting worker:  worker-0 ( 32831 )
worker-1 : 0
worker-1 : 1
worker-1 : 2
worker-1 : 3
worker-1 : 4
Exiting worker:  worker-1 ( 32834 )
worker-2 : 0
worker-2 : 1
worker-2 : 2
worker-2 : 3
worker-2 : 4
Exiting worker:  worker-2 ( 32837 )

ps命令输出

如果我在其他终端上连续运行ps命令,则会得到以下输出:

[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
[user@machine mu_min]$ python3 mu_min.py > mu_min_nix_out &
[1] 32830
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3
 32834  32830  32830  25898  |           |   \_ python3
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3
 32834  32830  32830  25898  |           |   \_ python3
 32837  32830  32830  25898  |           |   \_ python3
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3 <defunct>
 32834  32830  32830  25898  |           |   \_ python3
 32837  32830  32830  25898  |           |   \_ python3
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3 <defunct>
 32834  32830  32830  25898  |           |   \_ python3 <defunct>
 32837  32830  32830  25898  |           |   \_ python3
[user@machine mu_min]$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID'
   PID   PPID   PGID   SESS COMMAND
 32830  25898  32830  25898  |           \_ python3
 32831  32830  32830  25898  |           |   \_ python3 <defunct>
 32834  32830  32830  25898  |           |   \_ python3 <defunct>
 32837  32830  32830  25898  |           |   \_ python3 <defunct>

我有以下疑问

  1. multiprocessing doc page说:

      

    此外,它们不是Unix守护程序或服务,它们是正常进程,如果非守护进程退出,它们将终止(而不加入)。

    那么多处理程序不是在创建真正的守护程序吗(如以下疑问所解释)?我也没有得到“如果退出非守护进程将终止(并且不加入)”的含义。是什么意思?

  2. 我使用os.fork()处理signal.SIGCHLD编写了类似的带有双叉的代码。处理signal.SIGCHLD似乎不会遗漏已失效的进程。另外,由于两次分叉,似乎任何过程 创建的内容是使用PPID=1创建的,使其成为适当的守护程序。请注意,在上述ps中,已终止进程的命令输出PPID不是1。因此,它们似乎不是适当的守护程序。是这样吗?

1 个答案:

答案 0 :(得分:0)

回答第一个问题:

这些进程不是真正的Unix守护程序,它们在某种意义上是“守护程序”,与进程中的守护程序线程意义相同。

如果您的主进程完成并且辅助非守护进程仍在运行,则主进程将“加入”它,即等待其完成后再退出。但是,如果辅助进程是守护程序,则它将在主进程完成时终止。