concurrent.futures
concurrent.futures是一个为异步执行的可调用对象提供高层次接口的Python模块。
开发者可以通过ThreadPoolExecutor使用线程来执行异步任务,也可以通过ProcessPoolExecutor使用进程来执行这些任务。
特点:
ThreadPoolExecutor和ProcessPoolExecutor都继承了Executor,所以拥有相同的接口,可以在必要时修改并转换。
- 线程池和进程池的使用,可以大大提高程序的管理能力,节约程序开销。
示例代码:
defsample():
withThreadPoolExecutor(max_workers=4)ase:
e.submit(shutil.copy,’data1.txt’,’data1_handled.txt’)
e.submit(shutil.copy,’data2.txt’,’data2_handled.txt’)
e.submit(shutil.copy,’data3.txt’,’data3_handled.txt’)
e.submit(shutil.copy,’data4.txt’,’data4_handled.txt’)
defsample2():
executor=ThreadPoolExecutor(max_workers=4)
e.submit(shutil.copy,’data1.txt’,’data1_handled.txt’)
e.submit(shutil.copy,’data2.txt’,’data2_handled.txt’)
e.submit(shutil.copy,’data3.txt’,’data3_handled.txt’)
e.submit(shutil.copy,’data4.txt’,’data4_handled.txt’)
executor.shutdown()
PP
PP是一个开源跨平台的轻量级纯Python模块,它为运行在SMP(systemswithmultipleprocessors,多处理器系统)和集群上的Python并行代码提供了运行机制。
具有以下特征:
动态分配进程处理器
支持多处理器和集群
动态平衡任务分配
示例代码:
ppservers=()
#ppservers=(“10.0.0.1”,)
iflen(sys.argv)>1:
ncpus=int(sys.argv[1])
job_server=pp.Server(ncpus,ppservers=ppservers)
else:
job_server=pp.Server(ppservers=ppservers)
print”Startingppwith”,job_server.get_ncpus(),”workers”
job1=job_server.submit(sum_primes,(100,),(isprime,),(“math”,))
result=job1()
选用
模块的选用并没有固定的结果,只能说根据项目的具体需求并结合模块的特点来比较得出某一个模块更加适合的结果。
比如需要快速开发的时候,偶个人倾向于concurrent.futures,大家目前开发的机器学习推荐系统项目就是使用的concurrent.futures。
而当项目需要集群才能有足够计算力的时候,偶倾向于使用PP,大家开发的一部分深度学习引擎项目就是使用的PP。
选用什么还是需要因地制宜。
最后
小伙伴给偶看看你们的大拇指,不甚感激,跪拜。。。