Daemon vs worker e quando usar o que?

1

(Note que, abaixo, estou freqüentemente usando o termo " daemon ou worker " apenas para indicar que não sei qual palavra usar, pois não sei a diferença exata entre eles no contexto explicado abaixo.)

Considere os seguintes cenários:

  1. Eu preciso escrever um servidor escutando em alguma porta, que aceita uma solicitação nessa porta e bifurque um novo daemon ou worker para cada uma das solicitações recebidas para manipulá-las.
  2. Eu preciso escrever um servidor que inicie um número pré-determinado de daemons ou workers , então escute em alguma porta e, finalmente, ele atribua pedidos recebidos naquela porta para um dos atualmente livres daemons ou trabalhadores . Essa abordagem pré-cria um número pré-determinado de daemons ou workers apenas para evitar gerar grandes números deles se eu obtiver um grande número de solicitações, o que pode ser o caso no primeiro cenário.

Estou fazendo isso no linux usando python. Eu me deparei com duas abordagens para criar daemon ou worker :

  1. Usando multiprocessing.Process e definindo sua daemon para True . Quando tentei isso e observei os daemons ou workers na saída do comando ps , percebi que daemons ou workers não possuem PPID=1 (o processo initd no linux), mas PPID está definido para o PID (aqui 28822 ) do servidor. Observe que essa abordagem também deixa os daemons e workers em estado defunto e eles não são removidos da saída do comando ps automaticamente. Eu tenho que explicitamente matá-los.

    $ 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. No entanto, quando dou dois bifurcações usando os.fork() 1 , 2 e manipular singnal.SIGCHLD , ele não deixa processos defuntos e atribui corretamente os PPIDs desses daemons a 1. Por exemplo, seguindo o saída do 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
    

    Esses três processos python com PIDs {43683,43690,43699} são daemons ou workers , depois têm PPID=1 e desaparecem da saída do comando depois de serem executados totalmente.

Dúvidas

  1. Eu acredito que os processos com PPID=1 como criados por double forking são daemons unix reais. Além disso, observe que o documento de multiprocessamento diz o seguinte :

    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.

    Então, eu sinto que os processos criados pelo double forking são daemons reais do Linux, enquanto os processos criados pela biblioteca de multiprocessamento são apenas workers, mesmo que a biblioteca os chame de daemons.

    Estou certo com isso?

  2. Eu quero saber qual abordagem será adequada para os cenários acima. Eu sinto que o cenário 1 deve ser melhor implementado com abordagem de multiprocessamento, enquanto o cenário 2 deve ser melhor implementado com abordagem de bifurcação dupla.

    Estou certo com isso?

por Mahesha999 12.09.2018 / 11:18

1 resposta

1

Tecnicamente, um daemon também precisa chamar setsid() após forjar para iniciar uma nova sessão, tornar-se seu líder e separar-se do controlador tty, mas sim, você está correto.

Você realmente quer fazer as duas coisas em seus dois cenários. Você deseja primeiro daemonizar e, em seguida, o daemon pode bifurcar trabalhadores adicionais.

    
por 12.09.2018 / 18:52