Demone vs lavoratore e quando usare cosa?

1

(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:

  1. 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.
  2. 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 :

  1. Usando multiprocessing.Process e impostando il suo daemon a True . Quando ho provato questo e osservato i daemon o gli operatori nell'output del comando ps , mi sono reso conto che demoni o lavoratori non hanno PPID=1 (il processo initd in linux), ma il loro PPID è impostato sul PID (qui 28822 ) del server. Si noti che questo approccio lascia anche quei demoni e lavoratori in stato defunto e non vengono rimossi dall'output del comando ps 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>
    
  2. Tuttavia quando eseguo il doppio biforcazione utilizzando os.fork() 1 , 2 e gestisci singnal.SIGCHLD , non lascia processi defunti e assegna correttamente i PPID di quei daemon a 1. Ad esempio, seguendo il output del comando ps :

    $ 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

  1. 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?

  2. 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?

posta Mahesha999 11.09.2018 - 14:43
fonte

0 risposte