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简单格式化时间的方法【strftime函数】
Sep 18 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
python监控键盘输入实例代码
Feb 09 Python
利用Opencv中Houghline方法实现直线检测
Feb 11 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
利用Python实现原创工具的Logo与Help
Dec 03 Python
关于python中密码加盐的学习体会小结
Jul 15 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
Python 仅获取响应头, 不获取实体的实例
Aug 21 Python
python定位xpath 节点位置的方法
Aug 27 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
详解Python requests模块
Jun 21 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
PHP4(windows版本)中的COM函数
2006/10/09 PHP
PHP验证码函数代码(简单实用)
2013/09/29 PHP
php分页函数完整实例代码
2014/09/22 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
ie和firefox中img对象区别的困惑
2006/12/27 Javascript
JavaScript 面向对象的之私有成员和公开成员
2010/05/04 Javascript
JS高级笔记
2011/07/13 Javascript
在JS数组特定索引处指定位置插入元素
2014/07/27 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
Bootstrap基础学习
2015/06/16 Javascript
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
jQuery实现全选、反选和不选功能
2017/08/16 jQuery
详解如何在vue项目中使用eslint+prettier格式化代码
2018/11/10 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
vue实现可移动的悬浮按钮
2021/03/04 Vue.js
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
Python正则抓取网易新闻的方法示例
2017/04/21 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
css3中less实现文字长阴影(long shadow)
2020/04/24 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
JAVA程序员面试题
2012/10/03 面试题
工艺工程师工作职责
2013/11/23 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
《翻越远方的大山》教学反思
2014/04/13 职场文书
小学六年级学生评语
2014/04/22 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
大学生简历求职信
2014/06/24 职场文书
岗位说明书怎么写
2014/07/30 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL