(Si noti che, di seguito, utilizzo frequentemente il termine " daemon o worker " solo per indicare che non so quale parola usare perché non conosco la differenza esatta tra loro nel contesto spiegato sotto.)
Considera i seguenti scenari:
- Ho bisogno di scrivere un server in ascolto su qualche porta, che accetta una richiesta su quella porta e forchetta un nuovo demone o worker per ciascuna delle richieste in arrivo per gestirli.
- Ho bisogno di scrivere un server che inizi un certo numero predeterminato di demoni o lavoratori , poi ascolti su qualche porta, e infine assegni le richieste in arrivo su quella porta a uno dei attualmente gratuiti demoni o lavoratori . Questo approccio pre-crea il numero predeterminato di demoni o lavoratori solo per evitare di generarne un numero enorme se ottengo un numero enorme di richieste, il che potrebbe essere il caso nel primo scenario.
Lo sto facendo in linux usando python. Ho trovato due approcci per creare daemon o worker :
-
Usando
multiprocessing.Process
e impostando il suodaemon
aTrue
. Quando ho provato questo e osservato i daemon o gli operatori nell'output del comandops
, mi sono reso conto che demoni o lavoratori non hannoPPID=1
(il processoinitd
in linux), ma il loroPPID
è impostato sul PID (qui28822
) del server. Si noti che questo approccio lascia anche quei demoni e lavoratori in stato defunto e non vengono rimossi dall'output del comandops
automaticamente. Devo ucciderli esplicitamente.$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID' PID PPID PGID SESS COMMAND 28822 25898 28822 25898 | \_ python3 28823 28822 28822 25898 | | \_ python3 <defunct> 28828 28822 28822 25898 | | \_ python3 <defunct> 28831 28822 28822 25898 | | \_ python3 <defunct>
-
Tuttavia quando eseguo il doppio biforcazione utilizzando
os.fork()
1 , 2 e gestiscisingnal.SIGCHLD
, non lascia processi defunti e assegna correttamente i PPID di quei daemon a 1. Ad esempio, seguendo il output del comandops
:$ ps axo pid,ppid,pgid,sess,comm --forest | grep -E 'python| PID' PID PPID PGID SESS COMMAND 43680 43300 43680 43300 | \_ python3 43683 1 43682 43682 python3 43690 1 43689 43689 python3 43699 1 43698 43698 python3
Questi tre processi python con PID {43683,43690,43699} sono demoni o lavoratori , quindi hanno
PPID=1
e spariscono dall'output del comando una volta eseguiti completamente.
Dubbi
-
Credo che i processi con
PPID=1
creati dal doppio biforcazione siano veri daemon di unix. Inoltre, noti il documento di multiprocessing che segue :Additionally, these are not Unix daemons or services, they are normal processes that will be terminated (and not joined) if non-daemonic processes have exited.
Quindi, ritengo che i processi creati dal doppio biforcarsi siano dei veri daemon di Linux mentre i processi creati dalla libreria di multiprocessing sono solo operai, anche se la libreria li chiama daemon.
Ho ragione con questo?
-
Voglio sapere quale approccio sarà adatto per gli scenari di cui sopra. Ritengo che lo scenario 1 dovrebbe essere implementato meglio con l'approccio multiprocessing, mentre lo scenario 2 dovrebbe essere implementato meglio con un approccio double-fork.
Ho ragione con questo?