def _adjust_thread_count(self):
# When the executor gets lost, the weakref callback will wake up
# the worker threads.
def weakref_cb(_, q=self._work_queue):
q.put(None)
# TODO(bquinlan): Should avoid creating new threads if there are more
# idle threads than items in the work queue.
if len(self._threads) < self._max_workers:
t = threading.Thread(target=_worker,
args=(weakref.ref(self, weakref_cb),
self._work_queue))
t.daemon = True #确实是守护线程
t.start()
self._threads.add(t)
_threads_queues[t] = self._work_queue
在线程池里面启动的线程确实都是守护线程,但是主线程退出后,进程并没有退出,而是还在等子线程结束。接着深入代码以后发现是ThreadPool设计上为了不引起突然中断造成线程结束的其他坏影响,比如文件写到一半等,注册了atexit退出方法。简单的说就是在调用线程退出时,并没有真正退出,而是会去调用这个注册在ateixt上的方法,而线程池这个文件的退出方法就是等