class ThreadPool(object): def __init__(self, count=0): # 设置Pool运行状态 self.running = True from os import cpu_count # 用到的时候导入对应模块即可 # 默认是CPU核数,且至少有一个线程 if count <= 0: count = cpu_count() or 1 # 设置线程数 self.queue = Queue(count) # 启动对应个数的线程 for _ in range(count): Task(self.queue) # 不能在这直接启动,会阻塞Pool的 def apply_async(self, func, args=(), kws={}): if self.running: # 执行任务 self.queue.put((func, args, kws)) def close(self): # 不再运行加入任务 self.running = False def join(self): # 等待任务执行完退出 self.queue.join()
def main(): queue = Queue() # 开启生产消费者线程任务 t_list = [ threading.Thread(target=func, args=(queue, )) for func in (producer, consumer) ] # 启动两个线程 for t in t_list: # 设置后台线程,就算是死循环当主线程退出的时候也会退出的 t.setDaemon(True) # 进程是daemon属性,t.daemon=True t.start() # 等待所有任务完成 queue.join() # 你可以把这句话注释掉看输出 print(f"当前队列未完成的数量:{queue.unfinished_tasks}")