网络编程——线程池
在一个池子里,放固定数量的线程,这些线程等待任务,一旦有任务来,就有线程自发的去执行任务。
concurrent.futures 这个模块是异步调用的机制
concurrent.futures 提交任务都是用submit
for + submit 多个任务的提交
shutdown 是等效于Pool中的close + join ,是不允许再继续向池中增加任务,然后让父进程(线程)等待池中所有进程执行完所有任务。
如何把多个任务扔进池中?
要么使用 for+ submit 的方式去提交多个任务
要么直接使用map(func,iterable)方式去提交多个任务
from concurrent.futures import ThreadPoolExecutor import time def func(num): sum = 0 for i in range(num): sum += i **2 print(sum) t = ThreadPoolExecutor(20) start = time.time() t.map(func, range(1000)) t.shutdown() print(time.time() - start)
不同的方式提交多个任务(for + submit 或者map), 拥有不同的拿结果的方式
如果是for + submit 的方式提交任务,拿结果用result方法
如果是用map的方式提交任务,结果是一个生成器,采用__next__()的方式去拿结果
from concurrent.futures import ThreadPoolExecutor def func(num): sum = 0 for i in range(num): sum += i **2 return sum t = ThreadPoolExecutor(20) res = t.map(func, range(100)) t.shutdown() while 1: try: print(res.__next__()) except: StopIteration
关于回调函数,不管是Pool进程池的方式,还是ProcessPoolExecutor的方式开启进程池,
回调函数都是由父进程调用
关于回调函数,ThreadPoolExecutor
回调函数是由父进程调用