from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor import os import time ''' 进程池与线程池 开进程开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率 但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' # pool = ThreadPoolExecutor() # 括号内可以传参数指定线程池内的线程个数 # 也可以不穿默认的是计算机cpu个数乘以5 pool = ProcessPoolExecutor() # 不传,默认参数为cpu个数 ''' 池子中创建的进程或者线程创建一次就不会再创建了 至始至终用的都是最初的几个 这样的话节省了反复开辟进程或者线程的资源 ''' def task(n): print(n, os.getpid()) time.sleep(2) return n**2, n def call_back(x): print(x) print('拿到了异步提交任务的返回结果:', x.result()) # if __name__ == '__main__': # pool.submit(task, 2) # 朝线程池/进程池提交任务,异步提交 # print('zhu') ''' 异步提交任务之后,不等任务的返回结果(异步的结果怎么拿???),直接执行下一行代码 异步回调机制:当异步提交的任务有返回结果之后,会自动触发回调函数的执行 ''' if __name__ == '__main__': t_list = [] for i in range(40): # res = pool.submit(task, i) res = pool.submit(task, i).add_done_callback(call_back) # 提交任务的时候 绑定一个回调函数 一旦该任务有结果 立刻执行绑定的回调函数 # print(res.result()) # 原地等待任务的返回结果,把并行变成串行 # t_list.append(res) # pool.shutdown() # 关闭池子 等待池子中所有的任务执行完毕之后 才会执行下面的代码 # for p in t_list: # print('>>>:', p.result())