[python] 데몬 스레드 설명

에서 파이썬 문서
는 말합니다 :

스레드는 “데몬 스레드”로 플래그 될 수 있습니다. 이 플래그의 의미는 데몬 스레드 만 남으면 전체 Python 프로그램이 종료된다는 것입니다. 초기 값은 작성 스레드에서 상속됩니다.

누구에게 그 의미가 무엇인지에 대한 명확한 설명이나 스레드를 어디에 설정했는지 보여주는 실제적인 예가 daemonic있습니까?

나를 위해 그것을 명확히하십시오 : 그래서 스레드를로 설정하지 않을 유일한 상황 daemonic은 메인 스레드가 종료 된 후에 스레드를 계속 실행하고 싶을 때입니까?



답변

일부 스레드는 keepalive 패킷 전송, 주기적 가비지 수집 수행 등의 작업을 수행합니다. 이것은 주 프로그램이 실행 중일 때만 유용하며 데몬이 아닌 다른 스레드가 종료 된 후에 종료해도됩니다.

데몬 스레드가 없으면 프로그램을 완전히 종료하기 전에 해당 스레드를 추적하고 종료하도록 지시해야합니다. 그것들을 데몬 스레드로 설정함으로써, 그것들을 실행하고 잊게 할 수 있으며, 프로그램이 종료되면 데몬 스레드가 자동으로 종료됩니다.


답변

어떤 종류의 대시 보드 위젯을 만들고 있다고 가정 해 봅시다. 이 과정에서 이메일 상자에 읽지 않은 메시지 수를 표시하려고합니다. 따라서 작은 스레드를 만듭니다.

  1. 메일 서버에 연결하고 읽지 않은 메시지 수를 물어보십시오.
  2. 업데이트 된 카운트로 GUI에 신호를 보냅니다.
  3. 잠시 동안 잠을 자십시오.

위젯이 시작되면이 스레드를 작성하고 데몬을 지정한 후 시작합니다. 데몬이기 때문에 생각할 필요가 없습니다. 위젯이 종료되면 스레드가 자동으로 중지됩니다.


답변

다른 포스터는 데몬 스레드를 사용하는 상황에 대한 예를 제공했습니다. 그러나 내 권장 사항은 절대 사용하지 않는 것입니다.

유용하지 않기 때문에가 아니라 사용하면 부작용이 발생할 수 있습니다. Python 런타임이 메인 스레드에서 항목을 분리 한 후에도 데몬 스레드가 계속 실행될 수 있으므로 약간 기괴한 예외가 발생합니다.

여기에 더 많은 정보가 있습니다 :

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343697.html

엄밀히 말하면 필요하지 않으며 경우에 따라 구현이 더 쉬워집니다.


답변

그것에 대해 생각하는 가장 간단한 방법은 다음과 같습니다. 메인 리턴시 데몬이 아닌 스레드가 여전히 실행 중이면 프로세스가 종료되지 않습니다.

약간의 조언 : 스레드와 동기화가 관련된 경우 클린 셧다운이 잘못되기 쉽습니다. 피할 수 있으면 그렇게하십시오. 가능하면 데몬 스레드를 사용하십시오.


답변

Chris는 데몬 스레드가 무엇인지 이미 설명 했으므로 실제 사용법에 대해 이야기 해 봅시다. 많은 스레드 풀 구현은 작업 워커에 데몬 스레드를 사용합니다. 작업자는 작업 대기열에서 작업을 실행하는 스레드입니다.

새로운 작업이 언제 나타날지 알 수 없으므로 작업자는 작업 대기열에서 작업을 무기한 대기해야합니다. 작업 (예 : 메인 스레드)을 할당하는 스레드는 작업이 언제 끝났는지만 알고 있습니다. 메인 스레드는 작업 대기열에서 비워지기를 기다렸다가 종료합니다. 워커가 사용자 스레드 인 경우, 즉 데몬이 아닌 경우 프로그램이 종료되지 않습니다. 노동자들이 유용한 일을하지 않더라도이 무기한 노동자들을 계속 기다릴 것이다. 작업자 데몬 스레드를 표시하면 주 스레드는 작업 처리가 완료되는 즉시 해당 스레드를 처리합니다.


답변

Chris 인용 : “… 프로그램이 종료되면 데몬 스레드가 자동으로 종료됩니다.” 나는 그것을 요약 생각합니다. 메인 프로그램이 실행될 때 갑자기 종료되므로 사용시주의해야합니다.


답변

두 번째 스레드가 데몬이 아닌 경우 종료 기준이 데몬이 아닌 스레드의 종료에 연결되어 있기 때문에 응용 프로그램의 기본 기본 스레드를 종료 할 수 없습니다. 파이썬에서 스레드를 강제로 종료 할 수 없으므로 앱은 비 데몬 스레드가 종료 될 때까지 기다려야합니다. 이 동작이 원하는 것이 아니라면 두 번째 스레드를 데몬으로 설정하여 응용 프로그램이 종료되지 않도록하십시오.