【发布时间】:2018-09-05 07:14:50
【问题描述】:
我编写了一个服务器,它接受某个端口上的请求并派生一个新的守护进程来处理每个请求。我正在与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>
我有以下疑问
-
此外,这些不是 Unix 守护进程或服务,它们是正常进程,如果非守护进程退出,它们将被终止(而不是加入)。
那么多处理不是创建真正的守护进程吗(如下面的疑问所述)?我也没有理解“如果非守护进程退出,那将被终止(而不是加入)”的含义。什么意思?
我使用
os.fork()处理signal.SIGCHLD准备了类似的带有双分叉的代码。处理signal.SIGCHLD似乎不会留下失效的进程。此外,似乎由于双重分叉,任何进程 created 是用PPID=1创建的,使它们成为适当的守护进程。请注意,在上面的ps命令输出PPID的无效进程不是1。所以它们似乎不是正确的守护进程。是这样吗?
【问题讨论】:
标签: python python-3.x multithreading multiprocessing