데몬 프로세스와 작업자 프로세스, 그리고 언제 무엇을 사용합니까?

데몬 프로세스와 작업자 프로세스, 그리고 언제 무엇을 사용합니까?

(아래에서는 "라는 용어를 자주 사용합니다.데몬 또는 작업자"아래 설명된 문맥에서 나는 그 단어들 사이의 정확한 차이점을 모르기 때문에 어떤 단어를 사용해야 할지 모른다는 것을 보여주기 위해.)

다음 시나리오를 고려해보세요.

  1. 특정 포트에서 수신 대기하고 해당 포트의 요청을 수락하고 새 포트를 포크하는 서버를 작성해야 합니다.데몬 또는 작업자들어오는 모든 요청에 ​​대해 처리합니다.
  2. 미리 결정된 금액을 시작하는 서버를 작성해야 합니다.데몬 또는 작업자그런 다음 특정 포트에서 수신 대기하고 마지막으로 해당 포트에서 들어오는 요청을 현재 사용 가능한 포트 중 하나에 할당합니다.데몬 또는 작업자. 이 방법은 미리 정해진 수의데몬 또는 작업자단지 요청을 받을 때 많은 수의 요청이 발생하는 것을 방지하기 위한 것입니다. 이는 아마도 첫 번째 경우일 것입니다.

저는 리눅스에서 이 작업을 수행하기 위해 Python을 사용하고 있습니다. 나는 두 가지 생성 방법을 발견했습니다.데몬 또는 작업자:

  1. 사용하여multiprocessing.Process그리고 그것을 설정daemon도착하다 True. 이것을 시도하고 ps명령 출력에서 ​​데몬이나 작업자를 관찰했을 때 깨달았습니다.데몬 또는 작업자없음 PPID=1( initdLinux의 프로세스)이지만 서버의 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() 1,2그리고다루다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}인 세 가지 Python 프로세스는 다음과 같습니다.데몬 또는 작업자, PPID=1완전히 실행되면 명령 출력에서 ​​사라집니다.

의심

  1. PPID=1나는 이중 포크에 의해 생성된 프로세스가 진정한 유닉스 데몬이라고 믿습니다. 또한 주의사항다중 처리 문서는 다음과 같습니다:

    또한 이들은 Unix 데몬이나 서비스가 아니며 일반 프로세스이므로 데몬이 아닌 프로세스가 종료되면 종료됩니다(결합되지 않음).

    따라서 이중 포크로 생성된 프로세스는 실제 Linux 데몬인 반면, 다중 처리 라이브러리로 생성된 프로세스는 라이브러리에서 데몬이라고 부르더라도 단지 작업자일 뿐이라고 생각합니다.

    내가 맞나요?

  2. 위 시나리오에 어떤 방법이 적합한지 알고 싶습니다. 시나리오 1은 다중 처리 접근 방식으로 더 잘 구현되어야 하고, 시나리오 2는 이중 포크 접근 방식으로 더 잘 구현되어야 한다고 생각합니다.

    내가 맞나요?

답변1

기술적으로는 새 세션을 시작하고, 리더가 되고, 제어 tty에서 분리하기 위해 포크 이후에 데몬을 호출해야 setsid()하지만 네, 맞습니다.

사실, 두 경우 모두에서 두 가지를 모두 수행하고 싶습니다. 먼저 데몬화를 수행하면 데몬이 더 많은 작업자를 생성할 수 있습니다.

관련 정보