데몬 스레드 설명


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.