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 相关文章推荐
Python3.4实现远程控制电脑开关机
Feb 22 Python
Python操作MySQL模拟银行转账
Mar 12 Python
python中返回矩阵的行列方法
Apr 04 Python
解决pycharm 误删掉项目文件的处理方法
Oct 22 Python
Python的iOS自动化打包实例代码
Nov 22 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
Pytorch DataLoader 变长数据处理方式
Jan 08 Python
Python文件操作基础流程解析
Mar 19 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
python文件排序的方法总结
Sep 13 Python
python工具——Mimesis的简单使用教程
Jan 16 Python
Python卷积神经网络图片分类框架详解分析
Nov 07 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教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
PHP入门教程之会话控制技巧(cookie与session)
2016/09/11 PHP
php array_values 返回数组的值实例详解
2016/11/17 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
jQuery 选择器项目实例分析及实现代码
2012/12/28 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
JavaScript中eval()函数用法详解
2015/12/14 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
js 截取或者替换字符串中的数字实现方法
2016/06/13 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[01:27:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Aster BO3 第一场 1月24日
2021/03/11 DOTA
python实现数通设备tftp备份配置文件示例
2014/04/02 Python
使用简单工厂模式来进行Python的设计模式编程
2016/03/01 Python
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python编程实现双击更新所有已安装python模块的方法
2017/06/05 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
HTML5新增加标签和功能概述
2016/09/05 HTML / CSS
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
档案接收函
2014/01/13 职场文书
优秀社区干部事迹材料
2014/02/03 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
2014年个人思想工作总结
2014/11/27 职场文书
525心理健康活动总结
2015/05/08 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers
mysql拆分字符串作为查询条件的示例代码
2022/07/07 MySQL