Python基础教程之利用期物处理并发


Posted in Python onMarch 29, 2018

前言

抨击线程的往往是系统程序员,他们考虑的使用场景对一般的应用程序员来说,也许一生都不会遇到……应用程序员遇到的使用场景,99% 的情况下只需知道如何派生一堆独立的线程,然后用队列收集结果。

本文章记录了本人在学习Python基础之控制流程篇的重点知识及个人心得,打算入门Python的朋友们可以来一起学习并交流。

本文重点:

      1、掌握异步编程的相关概念;

      2、了解期物future的概念、意义和使用方法;

      3、了解Python中的阻塞型I/O函数释放GIL的特点。

一、异步编程相关概念

阻塞:程序未得到所需计算资源时被挂起的状态。换句话说,程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。

并发:描述的是程序的组织结构。指程序要被设计成多个可独立执行的子任务。并发以利用有限的计算机资源使多个任务可以被实时或近实时执行为目的。

并行:指的是多任务同时执行的程序状态,以利用多核CPU加速完成多任务为目的。

异步:为完成某个任务,不同程序单元之间过程中无需通信协调,也能完成任务的方式。

不相关的程序单元之间可以是异步的。简言之,异步意味着无序。

异步编程:以进程、线程、协程、函数/方法作为执行任务的基本单位,结合回调,事件循环、信号量等机制,以提高整体执行效率和并发能力的编程方式。

二、期物

就下载国旗为目标实现的三个客户端中,两个HTTP并发客户端比依序下载的脚本性能高很多。

由此说明使用并发可以高效处理网络I/O。

期物(future)指一种对象,表示异步执行的操作。

期物对象:concurrent.futures.Future或asyncio.Future类的实例。

三大方法:

  • Executor.submit():创建期物。
  • concurrent.futures.as_completed():迭代运行结束的期物,返回一个迭代器。
  • Executor.map(): 处理参数不同的同一个可调用对象。

小结:Executor.submit()加futures.as_completed()的组合比Executor.map()更灵活,因为submit()能处理不同的可调用对象和参数。

concurrent.futures模块的主要特色是ThreadPoolExecutor和ProcessPoolExecutor类,这两个类实现的接口能分别在不同的线程或进程中执行可调用的对象。

注意:通常情况下自己不应该创建期物,而只能由并发框架(concurrent.futures或asyncio)实例化。

实例:concurrent.futures模块应用

from concurrent import futures
from flags import save_flag, get_flag, show, main
MAX_WORKERS = 20
def download_one(cc): 
  image = get_flag(cc)
  show(cc)
  save_flag(image, cc.lower() + '.gif')
  return cc
def download_many(cc_list):
  workers = min(MAX_WORKERS, len(cc_list)) 
  with futures.ThreadPoolExecutor(workers) as executor: 
    res = executor.map(download_one, sorted(cc_list)) 
  return len(list(res))
if __name__ == '__main__':
  main(download_many)

三、阻塞性I/O与GIL

Python标准库中所有阻塞型I/O函数都会释放全局解释器锁(GIL),允许其他线程运行。

因此尽管有GIL,Python线程仍然适合在I/O密集型系统使用。

四、线程和多进程的替代方案

对CPU密集型工作来说,要启动多个进程,规避GIL。

创建多进程最简单的方式是使用futures.ProcessPoolExecutor类。

threading和multiprocessing模块:是Python中多线程和多进程并发的低层实现。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
python实现的防DDoS脚本
Feb 08 Python
Python Sleep休眠函数使用简单实例
Feb 02 Python
Python 使用os.remove删除文件夹时报错的解决方法
Jan 13 Python
Python加密方法小结【md5,base64,sha1】
Jul 13 Python
Python通过调用mysql存储过程实现更新数据功能示例
Apr 03 Python
详解Python如何生成词云的方法
Jun 01 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
​如何愉快地迁移到 Python 3
Apr 28 Python
torch 中各种图像格式转换的实现方法
Dec 26 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
linux centos 7.x 安装 python3.x 替换 python2.x的过程解析
Dec 14 Python
python的变量和简单数字类型详解
Sep 15 Python
Windows下安装Django框架的方法简明教程
Mar 28 #Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 #Python
Python实现发送与接收邮件的方法详解
Mar 28 #Python
Python实现线程状态监测简单示例
Mar 28 #Python
python实现朴素贝叶斯分类器
Mar 28 #Python
详解Python中where()函数的用法
Mar 27 #Python
Django基于ORM操作数据库的方法详解
Mar 27 #Python
You might like
php生成文件
2007/01/15 PHP
PHP动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
2014最热门的24个php类库汇总
2014/12/18 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP中检查isset()和!empty()函数的必要性
2019/02/13 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
PHP守护进程实例
2015/03/06 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
微信小程序开发探究
2016/12/27 Javascript
网页中的图片查看器viewjs使用方法
2017/07/11 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
在Windows8上的搭建Python和Django环境
2014/07/03 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
通过实例解析python and和or使用方法
2020/11/14 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
CSS3实现多背景模拟动态边框的效果
2016/11/08 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
个人批评与自我批评
2014/10/15 职场文书
四风问题专项整治工作情况报告
2014/10/28 职场文书
2014年反腐倡廉工作总结
2014/12/05 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
上班旷工检讨书
2015/08/15 职场文书
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js