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
いいえ。
まず第一に、それはプロセスではありません。
第二に、「バックグラウンド」はジョブ制御の用語です (基本的にコマンド ライン シェルによって実装される機能。ここで複数のプロセスを使用している場合でも、それは基本的に無視されます)。 。
最後に、ここでの設定は少し冗長です。でもそれは「ほんの少し」です。
マルチスレッドを正しく理解するのは簡単ではありません。信号は別の話です。 2 つのことをまとめると、Python プロセスは従わないことになります~ (Python では、シグナルは処理のためにメイン スレッドにのみ送信されます。メイン スレッドはシグナルを受信した後に終了することを決定しますが、非デーモン プロセスが積極的に終了しない場合は、 、そこでプロセスがハングしてしまうので、マルチスレッド クローラーを作成するときは、Ctrl-C )
ですぐに停止できるように daemon = True に統一します。ところで、約 1 ~ 2 か月前、python-cn リストで Python デーモン スレッドのトピックが議論されました。詳しく知りたい場合は、参照してください。