- 线程池的通过self._threads来维护
- 通过threading.Semaphore(0)来监控可用线程数
- 线程创建流程
# 如果有可用的线程则直接返回
if semaphore.acquire(False):
return
# 如果没有可用的线程且线程池未满,则创建新的线程并放入池中
# 也就是说该过程在执行一段时间后不会再执行
if len(self._threads) < max_threads:
self._threads.add(create_thread_task())
线程任务执行逻辑
- 开启一个
while True
循环,并不断的从ThreadPoolExecutor().queue中阻塞获取任务(在创建任务时,将ThreadPoolExecutor().queue以参数的形式传入) - 在执行完成后会释放semaphore,标识有线程可供使用
- 通过向queue中放入None来终止pool
创建执行任务
- 通过submit(fn, *args, **kwargs)创建任务_WorkItem实例,放入队列中
- 任务执行结果放入Future对象中,并将该Future对象返回