concurrent.futrues是个高级的的库,它只在“任务”级别进行操作,意思是你不需要关注同步和线程、进程的管理了。Future 其实是生产-消费者模型的一种扩展,在生产-消费者模型中,生产者不关心消费者什么时候处理完数据,也不关心消费者处理的结果。你只需要指定一个“max_workers”数量的线程/进程池,然后提交任务和整理结果即可,另一个好处是相对于threading和multiprocessing模块应用于多线程/多进程场景,频繁创建/销毁进程或者线程是非常消耗资源的,而concurrent.futrues有自己的线程池/进程池,以空间换时间。
concurrent.futrues有两个类:concurrent.futrues.ThreadPoolExecutor(线程池),通常用于IO密集型场景;concurrent.futrues.ProcessPoolExecutor(进程池),通常用于计算密集型场景,为什么这样分使用场景,那是python GIL锁的原因,多个线程只能用一个CPU,这里不再赘述了。两者的使用方法是一样。
ThreadPoolExecutor/ProcessPoolExecutor常用的方法如下:
1、ThreadPoolExecutor/ProcessPoolExecutor构造实例的时候,传入max_workers参数来设置线程池中最多能同时运行的线程数目。
2、submit(self, fn, *args, **kwargs)函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的句柄(类似于文件、画图),注意submit()不是阻塞的,而是立即返回。