데몬 스레드 설명


237

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

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

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

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

답변:


448

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

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


1
따라서 비 데몬으로 설정된 파일 쓰기 작업을 수행하는 자식 스레드가있는 경우 명시 적으로 종료해야합니까?
— Ciasto piekarz 2016 년

8
@san 글쓰기가 끝나면 글쓴이 스레드는 무엇을합니까? 그냥 돌아 갑니까? 그렇다면 충분합니다. 데몬 스레드는 일반적으로 루프에서 실행되고 자체적으로 종료되지 않는 작업을위한 것입니다.
— Chris Jester-Young

파일 쓰기 작업을 수행하기위한 유일한 목적은 아닙니다.
— Ciasto piekarz

2
@san 스레드 함수의 맨 아래에서 떨어지면 내재적으로 리턴됩니다.
— Chris Jester-Young

이 None경우 반환 되지만 중요하지 않습니다. 반환 값은 사용되지 않습니다.
— Chris Jester-Young

30

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

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

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


18

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

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

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

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

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

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


여전히 파이썬 3 에서이 문제가 있습니까? 문서에는 이러한 "기괴한 예외"에 관한 명확한 정보가 없습니다.
— kheraud

5
Joe의 블로그 게시물에서 : "2015 년 6 월 업데이트 : 이것은 Python 버그 1856 입니다. Python 3.2.1 및 3.3에서 수정되었지만이 수정은 결코 2.x로 백 포트되지 않았습니다. (2.7 지점으로 백 포트하려는 시도에서 다른 버그가 발생했습니다. Python> = 3.2.1에서는 데몬 스레드가 정상일 수 있지만 이전 버전에는없는 것은 아닙니다. "
— clacke

내 경험을 공유하고 싶습니다 : Thread로 여러 번 생성 된 기능이 있습니다. 그 안에 파이썬 인스턴스가 있었고 logging스레드를 완료 한 후 모든 객체 (각 스레드 / 기능에 대한 파일 설명자)가 파괴 될 것으로 예상했습니다. 프로그램이 끝날 때와 같은 많은 출력을 보았습니다 IOError: [Errno 24] Too many open files:. 와 함께 lsof -p pid_of_program, 나는 FD가 개방되어 있음을 발견했으며, 심지어 Thread / Functions이 작업을 완료하기가 힘들었습니다. 해결 방법? 함수 끝에서 로그 핸들러를 제거합니다. 그래서 daemonic스레드, 신뢰할 수있는 ...
— ivanleoncz

17

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

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


13

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

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


4
조심해! 프로그램이 중요한 작업 (예 : "백그라운드에서 일부 파일 업데이트")을 데몬 작업 대기열에 제출하면 작업을 수행하기 전에 프로그램이 종료되거나 파일을 업데이트하는 도중에 프로그램이 종료 될 위험이 있습니다.
— Solomon Slow

10

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


4

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.