concurrent.futures:是关于进程池 和 线程池 的
官方文档
https://docs.python.org/dev/library/concurrent.futures.html
现讲进程池把,看文档你会发现,两种池的用法几乎是一样的
一段代码来了:
from concurrent.futures import ProcessPoolExecutor impor time,os def work(n): print('%s is running'% os.getpid()) print('%s is end'% os.getpid()) return n**2 if __name__ == '__main__': p = ProcessPoolExecutor() # 默认是CPU的个数 start = time.time() l = [] for i in range(10): obj = p.submit(work,i) l.append(obj) p.shutdown() print([obj.result() for obj in l]) print(time.time()-start)
欧克!在上面的代码中 有几个关键的方法和类。
ProcessPoolExecutor :看类的名字,进程池, 创建进程池的,需要注意的是ProcessPoolExecutor()括号内默认的是本机的CPU个数。
p.submit 类似与Pool的apply_async方法,给进程传值,submit(函数名,函数的参数)
obj.result() 看看这个接口的名字,多好领会,得到结果的, 这个result()上面的方法submit()得到的结果是一个对象,想要得到实际的值,obj.result()就得得到值了,
是不是很简单
p.shutdown() 这个shutdown是用来等的,谁等呢,在哪里写的就是谁等,等上面的子进程运行完,在运行下面的。
还有一个map方法 ,我们再来看段代码。
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor import time,os from threading import currentThread def work(n): print('%s is running'% currentThread().name) time.sleep(2) print('%s is end'% currentThread().name) return n**2 if __name__ == '__main__': p = ThreadPoolExecutor() # 默认的CPU的个数*5 obj = p.map(work,range(10)) # 迭代器 p.shutdown() print(list(obj))
map方法
得到的是一个对象 obj=map(函数名,可迭代的对象)
就这么简单,跟之前的内置函数一样。
线程池中唯一不同的就是:
p = ThreadPoolExecutor() # 默认的CPU的个数*5