デーモンプロセスとワーカープロセス、そしていつ何を使用しますか?

デーモンプロセスとワーカープロセス、そしていつ何を使用しますか?

(以下では、「という用語をよく使用します。デーモンまたはワーカー「下記の文脈で、私はそれらの単語の間の正確な違いを知らないので、どの単語を使うべきかわからないことを示すために。)

次のシナリオを考えてみましょう。

  1. 特定のポートでリッスンし、そのポートからの要求を受け入れ、新しいポートをフォークするサーバーを作成する必要があります。デーモンまたはワーカーすべての着信要求に対処します。
  2. 所定の金額を開始するサーバーを作成する必要があります。デーモンまたはワーカー次に、特定のポートでリッスンし、最後にそのポートからの着信要求を現在使用可能なポートの1つに割り当てます。デーモンまたはワーカー。この方法は、所定の数のデーモンまたはワーカーただ要求を受け取るときに多数の要求が発生するのを防ぐためのものです。これはおそらく最初のケースです。

私はLinuxでこれを行うためにPythonを使用しています。私は2つの生成方法を見つけました。デーモンまたはワーカー:

  1. 使用してmultiprocessing.Processそしてそれを設定daemon到着するTrue。これを試してpsコマンド出力でデーモンやワーカーを観察したときに気づきました。デーモンまたはワーカーなしPPID=1initdLinuxのプロセス)ですが、サーバーのPPIDPID(ここ)に設定されています。28822このアプローチもデーモンとウォーカー誤った状態では、psコマンド出力から自動的に削除されません。明示的にそれらを殺す必要があります。

    $ 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. ところでダブルフォークを使ってみるとos.fork() 12そして扱うsingnal.SIGCHLD、死んだプロセスを残すことなく、これらのデーモンにPPID 1を正しく割り当てます。たとえば、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
    

    PIDが{43683、43690、43699}の3つのPythonプロセスは次のとおりです。デーモンまたはワーカーPPID=1完全に実行すると、コマンド出力から消えます。

疑い

  1. PPID=1私はデュアルフォークによって生成されたプロセスが真のUnixデーモンであると信じています。また注意事項マルチプロセッシング文書は次のとおりです。:

    また、これらはUnixデーモンやサービスではなく通常のプロセスなので、デーモン以外のプロセスが終了すると終了します(結合されていません)。

    したがって、デュアルフォークで作成されたプロセスは実際のLinuxデーモンですが、マルチプロセッシングライブラリで作成されたプロセスはライブラリでデーモンと呼ばれても作業者に過ぎません。

    私は正しいですか?

  2. 上記のシナリオでどのような方法が適切かを知りたいです。シナリオ1はマルチプロセッシングアプローチでよりよく実装されなければならず、シナリオ2はデュアルフォークアプローチでよりよく実装されるべきだと思います。

    私は正しいですか?

答え1

技術的には、新しいセッションを開始し、リーダーになり、制御ttyから切り離すためにフォークの後にデーモンを呼び出す必要がありますが、setsid()はい、そうです。

実際、両方のケースで両方を実行したいと思います。まず、デーモン化を実行すると、デーモンはより多くのワーカーを作成できます。

関連情報