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之入门(五)缩进和选择
May 27 Python
python获取远程图片大小和尺寸的方法
Mar 26 Python
Python数据类型详解(三)元祖:tuple
May 08 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
Python使用指定端口进行http请求的例子
Jul 25 Python
python实现银行管理系统
Oct 25 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 Python
Python中的Cookie模块如何使用
Jun 04 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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快速生成各种信息提示框的方法
2016/02/03 PHP
PHP数组函数array_multisort()用法实例分析
2016/04/02 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
JavaScript字符串删除重复字符的方法
2015/12/25 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
angular6.0使用教程之父组件通过url传递id给子组件的方法
2018/06/30 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
[46:43]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第二局
2016/03/02 DOTA
Python创建文件和追加文件内容实例
2014/10/21 Python
Python进阶篇之字典操作总结
2016/11/16 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
python学生管理系统学习笔记
2019/03/19 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
Python八皇后问题解答过程详解
2019/07/29 Python
python 提取文件指定列的方法示例
2019/08/07 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
如何用Python和JS实现的Web SSH工具
2021/02/23 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
移动端开发HTML5页面点击按钮后出现闪烁或黑色背景的解决办法
2018/09/19 HTML / CSS
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
英国在线定做百叶窗网站:Make My Blinds
2020/08/17 全球购物
PHP如何与mysql建立链接
2013/05/05 面试题
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
货代行业个人求职简历的自我评价
2013/10/22 职场文书
工商企业管理实习自我鉴定
2013/12/04 职场文书
植树节活动总结
2014/04/30 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年医院科室工作总结
2014/12/20 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang
python 解决微分方程的操作(数值解法)
2021/05/26 Python
Python中22个万用公式的小结
2021/07/21 Python
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python