concurrent模块
1、concurrent模块的介绍
concurrent.futures
模块提供了高度封装的异步调用接口ThreadPoolExecutor
:线程池,提供异步调用ProcessPoolExecutor
:进程池,提供异步调用ProcessPoolExecutor
和ThreadPoolExecutor
:两者都实现相同的接口,该接口由抽象Executor类定义。
2、基本方法
submit(fn, *args, **kwargs)
:异步提交任务map(func, *iterables, timeout=None, chunksize=1)
:取代for循环submit的操作shutdown(wait=True)
:相当于进程池的pool.close()+pool.join()
操作
- wait=True,等待池内所有任务执行完毕回收完资源后才继续
- wait=False,立即返回,并不会等待池内的任务执行完毕
- 但不管wait参数为何值,整个程序都会等到所有任务执行完毕
- submit和map必须在shutdown之前
result(timeout=None)
:取得结果add_done_callback(fn)
:回调函数
3、进程池和线程池
池的功能:限制进程数或线程数.
什么时候限制: 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量 我就应该考虑去限制我进程数或线程数,从保证服务器不崩.
3.1 进程池
from concurrent.futures import ProcessPoolExecutor import os import time def task(i): print("第"+str(i)+"个在执行任务id:"+str(os.getpid())) time.sleep(1) if __name__ == ‘__main__‘: start=time.time() pool = ProcessPoolExecutor(4) # 进程池里又4个进程 for i in range(5): # 5个任务 pool.submit(task,i)# 进程池里当前执行的任务i,池子里的4个进程一次一次执行任务 pool.shutdown() print("耗时:",time.time()-start)
3.2 线程池
from concurrent.futures import ThreadPoolExecutor from threading import currentThread import time def task(i): print("第"+str(i)+"个在执行任务id:"+currentThread().name) time.sleep(1) if __name__ == ‘__main__‘: start = time.time() pool = ThreadPoolExecutor(4) # 进程池里又4个线程 for i in range(5): # 5个任务 pool.submit(task,i)# 线程池里当前执行的任务i,池子里的4个线程一次一次执行任务 pool.shutdown() print("耗时:",time.time()-start)
3.3Map的用法
可以将多个任务一次性的提交给进程、线程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time,random def task(i): print("第"+str(i)+"个在执行任务id:"+str(os.getpid())) time.sleep(1) if __name__ == ‘__main__‘: start=time.time() pool=ProcessPoolExecutor(max_workers=3) #也可以换成ThreadPoolExecutor pool.map(task,range(1,5)) #map取代了for+submit pool.shutdown() print("耗时:",time.time()-start)
原文地址:https://www.cnblogs.com/wqbin/p/12593635.html
时间: 2024-10-09 06:08:20