首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这个进程是用python `mutliprocessing.Process().daemon=True`创建的,它是一个真正的守护进程吗?

这个进程是用python `mutliprocessing.Process().daemon=True`创建的,它是一个真正的守护进程吗?
EN

Stack Overflow用户
提问于 2018-09-05 07:14:50
回答 1查看 56关注 0票数 0

我已经编写了一个服务器,它接受某个端口上的请求,并分叉一个新的守护进程来处理每个请求。我在和模块做叉子。基本代码(没有端口侦听逻辑,因为我在这里不怀疑)如下所示:

码(mu_min.py)

代码语言:javascript
复制
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()

输出

代码语言:javascript
复制
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命令,则得到以下输出:

代码语言:javascript
复制
[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. 多处理文档页说: 此外,这些不是Unix守护进程或服务,它们是正常进程,如果非守护进程已经退出,它们将被终止(而不是加入)。

那么,多进程不是在创建真正的守护进程吗(正如下面的疑问所解释的)?此外,我也不明白“如果非守护进程已经退出,就会终止(而不是加入)”的意思。什么意思?

  1. 我使用os.fork()处理signal.SIGCHLD编写了类似的双分叉代码。处理signal.SIGCHLD似乎不会离开已失效的进程。而且,由于双分叉,创建的任何进程似乎都是用PPID=1创建的,使它们成为正确的守护进程。注意,在上面的ps命令中,失效进程的输出PPID不是1,所以它们似乎不是正确的守护进程。是这样吗?
EN

回答 1

Stack Overflow用户

发布于 2018-09-05 07:18:44

回答你的第一个问题:

这些进程不是真正的Unix守护进程,它们是与进程中的守护进程线程相同的“守护进程”。

如果您的主进程已经完成,而另一个非守护进程仍在运行,则主进程将“加入”它,即在退出之前等待它完成。但是,如果次要进程是守护进程,则主进程结束时将终止该进程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52179191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档