<强>一、并发模块的介绍强>
<代码> concurrent.futures 代码>模块提供了高度封装的异步调用接口
<代码> ThreadPoolExecutor> 代码:线程池,提供异步调用
<代码> ProcessPoolExecutor> 代码:进程池,提供异步调用
<代码> ProcessPoolExecutor 代码>和<代码> ThreadPoolExecutor> 代码:两者都实现相同的接口,该接口由抽象Executor类定义。
<强>二,基本方法强>
<代码>提交(fn, * args, * * kwargs) 代码>:异步提交任务
<代码>地图(func * iterable,超时=None, chunksize=1) 代码>:取代的循环提交的操作
<代码>关闭(等待=True)> 代码:相当于进程池的<代码> pool.close pool.join() +() 代码>操作
-
<李>等=True,等待池内所有任务执行完毕回收完资源后才继续李>
<李>等=False,立即返回,并不会等待池内的任务执行完毕李>
<李>但不管等参数为何值,整个程序都会等到所有任务执行完毕李>
<李>提交和地图必须在关闭之前李>
<代码>结果(超时=None) 代码>:取得结果
<代码> add_done_callback (fn)> 代码:回调函数
<强>三,进程池和线程池
强>
池的功能:限制进程数或线程数。
什么时候限制:当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量我就应该考虑去限制我进程数或线程数,从保证服务器不崩。
<强> 3.1进程池强>
从并发。期货进口ProcessPoolExecutor 从多处理导入过程,current_process 导入的时间 def任务(我): print (f ' {current_process () . name}在执行任务我{}”) time . sleep (1) if __name__==癬_main__”: 池=ProcessPoolExecutor(4) #进程池里又4个进程 因为我在范围(20):# 20个任务 pool.submit(任务,i) #进程池里当前执行的任务,池子里的4个进程一次一次执行任务
<强> 3.2线程池
强>
从并发。期货进口ThreadPoolExecutor 从进口线程,线程currentThread 导入的时间 def任务(我): print (f ' {currentThread () . name}在执行任务我{}”) time . sleep (1) if __name__==癬_main__”: 池=ThreadPoolExecutor(4) #进程池里又4个线程 因为我在范围(20):# 20个任务 pool.submit(任务,i) #线程池里当前执行的任务,池子里的4个线程一次一次执行任务
<强>四,地图的用法
强>
从并发。期货进口ThreadPoolExecutor ProcessPoolExecutor 进口操作系统、时间、随机的 def任务(n): 打印(' % s调速' % os.getpid ()) time . sleep (random.randint (1、3)) 返回n * * 2 if __name__==癬_main__”: 遗嘱执行人=ThreadPoolExecutor (max_workers=3) #我的范围(20): #未来=executor.submit(任务,我) executor.map(任务、范围(21))#地图取代了,+提交
<强>五,同步和异步强>
理解为提交任务的两种方式
同步:提交了一个任务,必须等任务执行完了(拿到返回值),才能执行下一行代码
异步:提交了一个任务,不要等执行完了,可以直接执行下一行代码。
同步:相当于执行任务的串行执行
异步
从并发。期货进口ProcessPoolExecutor 从多处理导入过程,current_process 导入的时间 n=1 def任务(我): 全球n print (f ' {current_process () . name}在执行任务我{}”) time . sleep (1) n +=我 返回n if __name__==癬_main__”: 池=ProcessPoolExecutor(4) #进程池里又4个线程 pool_lis=[] 因为我在范围(20):# 20个任务 未来=pool.submit(任务,i) #进程池里当前执行的任务,池子里的4个线程一次一次执行任务 #打印(future.result()) #这是在等待我执行任务得到的结果,如果一直没有结果,这里会导致我们所有任务编程了串行 #在这里就引出了下面的pool.shutdown()方法 pool_lis.append(未来) pool.shutdown (wait=True) #关闭了池的入口,不允许在往里面添加任务了,会等带所有的任务执行完,结束阻塞 在pool_lis: p print (p.result ()) 打印(n) #这里一开始肯定是拿到0的,因为我只是去告诉操作系统执行子进程的任务,代码依然会继续往下执行 #可以用加入去解决,等待每一个进程结束后,拿到他的结果python程序中的线程操作并发模块使用详解