线程池 发表于 2019-10-13 | 分类于 python , 内置库 Python 线程池的两种实现 创建和销毁线程对象都会消耗系统资源和时间, 线程池的原理就是复用已创建的线程对象执行操作,以此来提高程序效率。 具体实现:开启 n 个线程无限循环地从工作队列中获取任务执行。 利用 并发未来包 12345678910111213141516171819202122import time from concurrent.futures import ThreadPoolExecutor, as_completed def task(n): """任务定义""" time.sleep(2) return n + 10 with ThreadPoolExecutor(max_workers=4) as executor: # 1.map 方式 iter_args = range(9) res_list = executor.map(task, iter_args) for i in res_list: print("map: ", i) # 2.submit + as_completed 组合 future_list = [executor.submit(task, j) for j in range(9)] for future in as_completed(future_list): data = future.result() print("submit + as_completed: ", data) 参考 官方文档 自定义 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051import time from queue import Queue from threading import Thread, current_thread class Work(Thread): def __init__(self, work_queue: Queue): Thread.__init__(self) self.work_queue = work_queue self.start() def run(self) -> None: while True: try: do, args = self.work_queue.get(block=False) do(args) self.work_queue.task_done() except Exception as e: print(e) break class WorkManager: def __init__(self, max_workers=3): self.max_workers = max_workers self.work_queue = Queue() self.threads = [] def submit(self, task, args): """提交任务""" self.work_queue.put((task, args)) def wait_all_completed(self): self.threads = [Work(self.work_queue) for _ in range(self.max_workers)] for i in self.threads: if i.is_alive(): i.join() def my_task(n): """任务定义""" time.sleep(2) print(n + 10, current_thread()) return n + 10 if __name__ == '__main__': work_manager = WorkManager(max_workers=3) [work_manager.submit(my_task, i) for i in range(9)] work_manager.wait_all_completed()