首页 文章 精选 留言 我的

精选列表

搜索[并发编程],共10000篇文章
优秀的个人博客,低调大师

python并发模块之concurrent.futures(一)

Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threading和multiprocessing的进一步抽象,对编写线程池/进程池提供了直接的支持,他属于上层的封装,对于用户来说,不用在考虑那么多东西了。 官方参考资料:https://pythonhosted.org/futures/ 1.Executor Exectuor是基础模块,这是一个抽象类,其子类分为ThreadPoolExecutor和ProcessPoolExecutor,分别被用来创建线程池和进程池。 提供的方法如下: Executor.submit(fn, *args, **kwargs) fn:为需要异步执行的函数 args,kwargs:为给函数传递的参数 就来看看官网的这个例子: withThreadPoolExecutor(max_workers=1)asexecutor: future=executor.submit(pow,323,1235) print(future.result()) 我们使用submit方法来往线程池中加入一个task(pow函数),submit返回一个Future对象。其中future.result()的result方法的作用是拿到调用返回的结果。如果没有执行完毕就会去等待。这里我们使用with操作符,使得当任务执行完成之后,自动执行shutdown函数,而无需编写相关释放代码。 关于更多future的具体方法说明看后面的future部分解释。 Executor.map(fn, *args, **kwargs) map(func, *iterables, timeout=None) 此map函数和python自带的map函数功能类似,只不过concurrent模块的map函数从迭代器获得参数后异步执行。并且,每一个异步操作,能用timeout参数来设置超时时间,timeout的值可以是int或float型,如果操作timeout的话,会raisesTimeoutError。如果timeout参数不指定的话,则不设置超时间。 func:为需要异步执行的函数 iterables:可以是一个能迭代的对象. timeout:设置每次异步操作的超时时间 fromconcurrent.futuresimportThreadPoolExecutorimportrequests URLS=['http://www.163.com','https://www.baidu.com/','https://github.com/']defload_url(url): req=requests.get(url,timeout=60) print('%rpageis%dbytes'%(url,len(req.content))) executor=ThreadPoolExecutor(max_workers=3) executor.map(load_url,URLS) print('主线程结束') submit函数和map函数,根据需要,选一个使用即可。 Executor.shutdown(wait=True) 此函数用于释放异步执行操作后的系统资源。Executor实现了enter__和__exit使得其对象可以使用with操作符。 在这里可以使用with上下文关键字代替,如上面第一个submit的例子。 2.Future对象 submit函数返回future对象,future提供了跟踪任务执行状态的方法,Future实例可以被Executor.submit()方法创建。除了测试之外不应该直接创建。 cancel():尝试去取消调用。如果调用当前正在执行,不能被取消。这个方法将返回False,否则调用将会被取消,方法将返回True cancelled():如果调用被成功取消返回True running():如果当前正在被执行不能被取消返回True done():如果调用被成功取消或者完成running返回True result(Timeout = None):拿到调用返回的结果。如果没有执行完毕就会去等待 exception(timeout=None):捕获程序执行过程中的异常 add_done_callback(fn):将fn绑定到future对象上。当future对象被取消或完成运行时,fn函数将会被调用 3.wait方法 wait方法接会返回一个tuple(元组),tuple中包含两个set(集合),一个是completed(已完成的)另外一个是uncompleted(未完成的)。使用wait方法的一个优势就是获得更大的自由度,它接收三个参数FIRST_COMPLETED, FIRST_EXCEPTION 和ALL_COMPLETE,默认设置为ALL_COMPLETED。 如果采用默认的ALL_COMPLETED,程序会阻塞直到线程池里面的所有任务都完成,再执行主线程: #!/usr/bin/envpython#encoding:utf-8fromconcurrent.futuresimportThreadPoolExecutor,wait,as_completedimportrequests URLS=['http://www.163.com','https://www.baidu.com/','https://github.com/']defload_url(url): req=requests.get(url,timeout=60) print('%rpageis%dbytes'%(url,len(req.content))) executor=ThreadPoolExecutor(max_workers=3) f_list=[]forurlinURLS: future=executor.submit(load_url,url) f_list.append(future) print(wait(f_list)) print('主线程结束') 如果采用FIRST_COMPLETED参数,程序并不会等到线程池里面所有的任务都完成。 fromconcurrent.futuresimportThreadPoolExecutor,wait,as_completedimportrequests URLS=['http://www.163.com','https://www.baidu.com/','https://github.com/']defload_url(url): req=requests.get(url,timeout=60) print('%rpageis%dbytes'%(url,len(req.content))) executor=ThreadPoolExecutor(max_workers=3) f_list=[]forurlinURLS: future=executor.submit(load_url,url) f_list.append(future) print(wait(f_list,return_when='FIRST_COMPLETED')) print('主线程结束') 关于模块的基本使用就是上面的这些。后续会做一些拓展或者案例。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册