linux - 关于python中的Queue与daemon进程?
PHPz
PHPz 2017-04-18 09:47:47
0
1
465

https://docs.python.org/2.7/library/queue.html

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

q = Queue()
for i in range(num_worker_threads):
     t = Thread(target=worker)
     t.daemon = True
     t.start()

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

A thread can be flagged as a “daemon thread”. The significance of this flag is that the entire Python program exits when only daemon threads are left.

上面这个例子中,同时设置q.join()和t.daemon = True是不是自相矛盾?设置q.join()的话也就是说要等Queue中所有thread发送task_done信号,也就是说要让Queue里面的所有thread全部执行完才继续执行下一步。既然这样的话还设置t.daemon = True干什么呢?t.daemon=True的目的不是让守护进程在后台执行吗?

Setting daemon to True will let the main thread exit even though thworkers are blocking

q.join() Causes the main thread to wait for the queue to finish processing all the tasks

PHPz
PHPz

学习是最好的投资!

모든 응답(1)
PHPzhong

t.daemon=True의 목적은 데몬 프로세스가 백그라운드에서 실행되도록 하는 것이 아닌가요?

아니요.

우선 과정이 아닙니다.

둘째, "백그라운드"는 작업 제어(기본적으로 명령줄 셸에 의해 구현되는 기능, 다른 프로그램에서는 기본적으로 이를 무시함)를 의미하는 용어입니다. 여기서는 여러 프로세스를 사용하더라도 해당 시나리오에 적용되지 않습니다. .

마지막으로 여기 설정이 약간 중복됩니다. 그러나 그것은 단지 "조금"일 뿐이다.

멀티스레딩은 제대로 하기가 쉽지 않습니다. 신호는 또 다른 것입니다. 두 가지를 합치면 Python 프로세스가 불순종합니다~ (Python에서는 처리를 위해 신호가 메인 스레드에만 제출됩니다. 메인 스레드는 신호를 받은 후 종료하기로 결정하지만 데몬이 아닌 프로세스가 적극적으로 종료되지 않으면 , 프로세스가 중단됩니다. 따라서 멀티 스레드 크롤러를 작성할 때 Ctrl-C )

할 때 빠르게 중지할 수 있도록 daemon = True를 통합합니다.

그나저나 한두 달 정도 전에 python-cn 목록에서 Python 데몬 스레드에 대한 주제를 논의했습니다. 이에 대해 더 알고 싶으시면 가서 살펴보시면 됩니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿