답변:
일부 스레드는 keepalive 패킷 전송, 주기적 가비지 수집 수행 등의 작업을 수행합니다. 이것은 주 프로그램이 실행 중일 때만 유용하며 데몬이 아닌 다른 스레드가 종료 된 후에 종료해도됩니다.
데몬 스레드가 없으면 프로그램을 완전히 종료하기 전에 해당 스레드를 추적하고 종료하도록 지시해야합니다. 그것들을 데몬 스레드로 설정함으로써, 그것들을 실행하고 잊게 할 수 있으며, 프로그램이 종료되면 데몬 스레드가 자동으로 종료됩니다.
None
경우 반환 되지만 중요하지 않습니다. 반환 값은 사용되지 않습니다.
다른 포스터는 데몬 스레드를 사용하는 상황에 대한 예를 제공했습니다. 그러나 내 권장 사항은 절대 사용하지 않는 것입니다.
유용하지 않기 때문에가 아니라 사용하면 부작용이 발생할 수 있습니다. Python 런타임이 메인 스레드에서 항목을 분리 한 후에도 데몬 스레드가 계속 실행될 수 있으므로 약간 기괴한 예외가 발생합니다.
여기에 더 많은 정보가 있습니다 :
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
엄밀히 말하면 필요하지 않으며 경우에 따라 구현이 더 쉬워집니다.
logging
스레드를 완료 한 후 모든 객체 (각 스레드 / 기능에 대한 파일 설명자)가 파괴 될 것으로 예상했습니다. 프로그램이 끝날 때와 같은 많은 출력을 보았습니다 IOError: [Errno 24] Too many open files:
. 와 함께 lsof -p pid_of_program
, 나는 FD가 개방되어 있음을 발견했으며, 심지어 Thread / Functions이 작업을 완료하기가 힘들었습니다. 해결 방법? 함수 끝에서 로그 핸들러를 제거합니다. 그래서 daemonic
스레드, 신뢰할 수있는 ...
Chris는 데몬 스레드가 무엇인지 이미 설명 했으므로 실제 사용법에 대해 이야기 해 봅시다. 많은 스레드 풀 구현은 작업 워커에 데몬 스레드를 사용합니다. 작업자는 작업 대기열에서 작업을 실행하는 스레드입니다.
새로운 작업이 언제 나타날지 알 수 없으므로 작업자는 작업 대기열에서 작업을 무기한 대기해야합니다. 작업 (예 : 메인 스레드)을 할당하는 스레드는 작업이 언제 끝났는지만 알고 있습니다. 메인 스레드는 작업 대기열에서 비워지기를 기다렸다가 종료합니다. 워커가 사용자 스레드 인 경우, 즉 데몬이 아닌 경우 프로그램이 종료되지 않습니다. 노동자들이 유용한 일을하지 않더라도이 무기한 노동자들을 계속 기다릴 것이다. 작업자 데몬 스레드를 표시하면 주 스레드는 작업 처리가 완료되는 즉시 해당 스레드를 처리합니다.