python 使用期物处理并发

文章目录

    • 1. futures.ThreadPoolExecutor
    • 2. 期物
    • 3. 阻塞型I/O和GIL
    • 4. 使用concurrent.futures模块启动进程

learning from 《流畅的python》

1. futures.ThreadPoolExecutor

import os
import time
import sys
import requestsPOP20_CC = ('CN IN US ID BR PK NG BD RU JP ' 'MX PH VN ET EG DE IR TR CD FR').split()
BASE_URL = 'http://flupy.org/data/flags'
DEST_DIR = './'def save_flag(img, filename):  # 保存图像path = os.path.join(DEST_DIR, filename)with open(path, 'wb') as fp:fp.write(img)def get_flag(cc):  # 获取图像url = '{}/{cc}/{cc}.gif'.format(BASE_URL, cc=cc.lower())resp = requests.get(url)return resp.contentdef show(text):  # 打印信息print(text, end=' ')sys.stdout.flush()def download_many(cc_list):for cc in sorted(cc_list):image = get_flag(cc)  # 获取show(cc)  # 打印save_flag(image, cc.lower() + '.gif')  # 保存return len(cc_list)def main(download_many):t0 = time.time()count = download_many(POP20_CC)elapsed = time.time() - t0msg = '\n{} flags downloaded in {:.2f}s'print(msg.format(count, elapsed))  # 计时信息# ----使用 futures.ThreadPoolExecutor 类实现多线程下载
from concurrent import futuresMAX_WORKERS = 20  # 最多使用几个线程def download_one(cc):image = get_flag(cc)show(cc)save_flag(image, cc.lower() + '.gif')return ccdef download_many_1(cc_list):workers = min(MAX_WORKERS, len(cc_list))with futures.ThreadPoolExecutor(workers) as executor:#  使用工作的线程数实例化 ThreadPoolExecutor 类;#  executor.__exit__ 方法会调用 executor.shutdown(wait=True) 方法,#  它会在所有线程都执行完毕 前阻塞线程res = executor.map(download_one, sorted(cc_list))# download_one 函数 会在多个线程中并发调用;# map 方法返回一个生成器,因此可以迭代, 获取各个函数返回的值return len(list(res))if __name__ == '__main__':# main(download_many) # 24 秒main(download_many_1)  # 3 秒

2. 期物

  • 通常不应自己创建期物
  • 只能由并发框架(concurrent.futuresasyncio)实例化
    原因:期物 表示终将发生的事情,其 执行的时间 已经排定。因此,只有排定把某件事交给 concurrent.futures.Executor 子类处理时,才会创建 concurrent.futures.Future 实例
    例如,Executor.submit() 方法的参数是一个可调用的对象,调用这个方法后会为传入的可调用对象 排期,并返回一个期物
def download_many_2(cc_list):cc_list = cc_list[:5]with futures.ThreadPoolExecutor(max_workers=3) as executor:to_do = []for cc in sorted(cc_list):future = executor.submit(download_one, cc)# executor.submit 方法排定可调用对象的执行时间,# 然后返回一个 期物,表示这个待执行的操作to_do.append(future) # 存储各个期物msg = 'Scheduled for {}: {}'print(msg.format(cc, future))results = []for future in futures.as_completed(to_do):# as_completed 函数在期物运行结束后产出期物res = future.result() # 获取期物的结果msg = '{} result: {!r}'print(msg.format(future, res))results.append(res)return len(results)
输出:
Scheduled for BR: <Future at 0x22da99d2d30 state=running>
Scheduled for CN: <Future at 0x22da99e1040 state=running>
Scheduled for ID: <Future at 0x22da99e1b20 state=running>
Scheduled for IN: <Future at 0x22da99ec520 state=pending>
Scheduled for US: <Future at 0x22da99ecd00 state=pending>
CN <Future at 0x22da99e1040 state=finished returned str> result: 'CN'
BR <Future at 0x22da99d2d30 state=finished returned str> result: 'BR'
ID <Future at 0x22da99e1b20 state=finished returned str> result: 'ID'
IN <Future at 0x22da99ec520 state=finished returned str> result: 'IN'
US <Future at 0x22da99ecd00 state=finished returned str> result: 'US'5 flags downloaded in 3.20s

3. 阻塞型I/O和GIL

CPython 解释器本身就不是线程安全的,因此有全局解释器锁(GIL), 一次只允许使用一个线程执行 Python 字节码。因此,一个 Python 进程 通常不能同时使用多个 CPU 核心

标准库中所有执行阻塞型 I/O 操作的函数,在等待操作系统返回结果时 都会释放 GIL
这意味着在 Python 语言这个层次上可以使用多线程,而 I/O 密集型 Python 程序能从中受益:一个 Python 线程等待网络响应时,阻塞型 I/O 函数会释放 GIL,再运行一个线程(网络下载,文件读写都属于 IO 密集型)

4. 使用concurrent.futures模块启动进程

这个模块实现的是真正 的并行计算,因为它使用 ProcessPoolExecutor 类把工作分配给多个 Python 进程处理。
因此,如果需要做 CPU 密集型处理,使用这个模块 能绕开 GIL,利用所有可用的 CPU 核心

点击查看:进程、线程概念差异

使用 concurrent.futures 模块能特别轻松地 把 基于线程 的方案转成 基于进程 的方案

ProcessPoolExecutor 的价值体现在 CPU 密集型 作业上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471720.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【linux高级程序设计】(第十三章)Linux Socket网络编程基础 2

BSD Socket网络编程API 创建socket对象 int socket (int __domain, int __type, int __protocol) &#xff1a;成功返回socket文件描述符&#xff0c;失败返回-1. 参数1&#xff1a;socket对象使用的地址簇或协议簇 常用的有PF_LOCAL(本机通信)、PF_INET(IPv4协议簇)、PF_INET6…

数据库中有痣但是有时取不到_农村这种长得像“泥鳅”的鱼,以前没人吃,现在可能有钱都吃不到...

只说真话的农民公众号原创文章&#xff0c;严禁转载在农村中有很多不能叫出名字的花草和野味&#xff0c;它们当中虽然有些长得比较奇怪&#xff0c;名字也比较奇怪&#xff0c;但是却是非常好的疗补食物。有些花草是治疗疾病的良药&#xff0c;有些野味现在也被搬上了酒桌。但…

简述计算机的英语作文,初中计算机的英语作文

初中计算机的英语作文发布时间&#xff1a;2020-04-07在过去的时间里&#xff0c;计算机得到了很大的改进。下面是小编为大家精心整理的关于初中计算机的英语作文&#xff0c;希望能够帮助到你们。The ComputerThe computer is widely used in all phases of society. In indus…

(第三天)函数

定义函数 关键字function用来定义函数。定义函数有两种方法 &#xff08;1&#xff09;函数定义表达式 1 var f function(x) { return x1; } &#xff08;2&#xff09;函数声明语句 1 function funcname([arg1 [, arg2 [...,argn]]]) { 2 3 } 函数声明语句通常出现在JavaScr…

python 使用 asyncio 包处理并发

文章目录1. 线程与协程对比2. 使用 asyncio 和 aiohttp 下载3. 避免阻塞型调用4. 使用 asyncio.as_completed5. 使用Executor对象&#xff0c;防止阻塞事件循环6. 从回调到期物和协程learn from 《流畅的python》 1. 线程与协程对比 threading import threading import iter…

ai预测占比_2019-2021年中国AI芯片市场预测与展望数据

来源&#xff1a;雪球App&#xff0c;作者&#xff1a; IC咖啡&#xff0c;(https://xueqiu.com/1118999957/139121699)预计未来三年AI芯片市场规模仍将保持50%以上的增长速度&#xff0c;到2019年中国AI芯片市场规模将达到124.1亿元。从细分市场结构来看&#xff0c;云端训练芯…

计算机专业英语第2版郭涛翻译,计算机专业英语

计算机专业英语作  者&#xff1a;郭涛 主编出版时间&#xff1a;2007年01月定  价&#xff1a;21.60I S B N &#xff1a;9787560939209所属分类&#xff1a; 大中专教材 > 研究生/本科/专科教材 &nbsp大中专教材 &nbsp语言学习 > 大学英语 &nbsp语…

ODS与数据仓库

数据仓库是目前主要的数据存储体系。数据仓库之增W.H.Inmon认为&#xff0c;数据仓库是指支持管理决策过程的、面向主题的、集成的、随时间而变的、持久的数据的集合。简单地说&#xff0c;一个数据仓库就一个自数据库的商业应用系统&#xff0c;该数据库的数据来自于其它的运作…

LeetCode 1991. 找到数组的中间位置(前缀和)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的整数数组 nums &#xff0c;请你找到 最左边 的中间位置 middleIndex &#xff08;也就是所有可能中间位置下标最小的一个&#xff09;。 中间位置 middleIndex 是满足 nums[0] nums[1] ... nums[middleIndex-1] n…

mysq命令行导出sql_mysql 命令行导入导出 sql

命令行source 导入数据库&#xff1a;代码如下复制代码1&#xff0c;将要导入的.sql文件移至bin文件下&#xff0c;这样的路径比较方便2&#xff0c;同上面导出的第1步3&#xff0c;进入MySQL&#xff1a;mysql -u 用户名 -p如我输入的命令行:mysql -u root -p (输入同样后会…

计算机应用基础第六章,《计算机应用基础》第六章习题

周南岳版第六章习题及答案《计算机应用基础》教材第6章习题一、填空题(1)计算机网络中共享资源指的是硬件、软件和___数据___资源。(2)计算机网络中&#xff0c;通信双方必须共同遵守的规则或约定&#xff0c;称为__协议__。(3)在计算机局域网中&#xff0c;将计算机连接到网络…

discuz MVC结构分析

Discuz软件经解压后产生的三个文件夹中的一个叫upload的成为网站的根目录。里面的内容可以在某些网站上在线阅读&#xff0c;如用好库编程网。也可以离线在本地阅读&#xff0c;如用VS.Php for Visual Studio。这里面的内容安排的井然有序。不同用途的文件都放在了不同的文件夹…

postforobject 设置代理_Spring RestTemplate和代理身份验证

小编典典经过许多不同的选择之后&#xff0c;由于能够在创建时为RestTemplate设置代理&#xff0c;因此我可以选择以下代码&#xff0c;因此我可以将其重构为单独的方法。只是要注意&#xff0c;它还具有其他依赖性&#xff0c;因此请记住这一点。private RestTemplate createR…

LeetCode 1992. 找到所有的农场组(BFS)

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始&#xff0c;大小为 m x n 的二进制矩阵 land &#xff0c;其中 0 表示一单位的森林土地&#xff0c;1 表示一单位的农场土地。 为了让农场保持有序&#xff0c;农场土地之间以矩形的 农场组 的形式存在。 每一个农场组都…

flash html5 chrome,为了支持 HTML5 ,谷歌 Chrome 浏览器将“封杀”Flash

关于谷歌 Chrome 将不再支持 Flash 的话题&#xff0c;已经争论了很长一段时间了。不过现在&#xff0c;这家互联网巨头终于确认&#xff0c;为了支持 HTML5&#xff0c;Chrome 浏览器将不再运行 Flash。据谷歌表示&#xff0c;由于 Flash 会减慢网页浏览速度并可能引发信息安全…

VS2015开发Android,自带模拟器无法调试、加载程序,算是坑吗

VS2015出来后&#xff0c;确定变化很大&#xff0c;什么android、ios的&#xff0c;不在话下。对于我这样传统型的人&#xff0c;也第一时间试用了一下&#xff08;vs2003->vs2008->vs2012->vs2015&#xff09;。以前用eclipse开发过android小程序&#xff0c;现在想试…

amd cpu 安卓模拟器_夜神模拟器常见问题解答_v20201025

MAC版本常见问题Mac版本模拟器常见问题MAC模拟器出现“您应该将它移到废纸篓”解决办法MAC版本模拟器功能介绍MAC版本模拟器界面Mac版模拟器可能无法启动(卡99%)的原因及解决方式其他问题如何在夜神模拟器中安装自己想要的游戏/应用Sample CA 2证书没网解决办法GlobalSignature…

LeetCode 502. IPO(优先队列)

文章目录1. 题目2. 解题1. 题目 假设 力扣&#xff08;LeetCode&#xff09;即将开始 IPO 。 为了以更高的价格将股票卖给风险投资公司&#xff0c;力扣 希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限&#xff0c;它只能在 IPO 之前完成最多 k 个不同的项目。 帮助…

计算机水平考试ppt试卷,计算机等级考试一级笔试卷库.ppt

计算机等级考试一级笔试卷库计算机等级考试一级笔试题库 全国计算机等级考试一级题库 1&#xff0e;微机中1K字节表示的二进制位数是( )。? A、1000 B、8x 1000 C、1024 D、8x1024?? 2&#xff0e;计算机硬件能直接识别和执行的只有( )。 A、高级语言 B、符号语言 C、汇编语…

mysql中ibatis的limit动态传参

param.put("pageNo",pageNo); param.put("pageSize",pageSize); sqlMap中的用法 limit ${pageNo},${pageSize} 我今天在敲代码的时候这么用结果就报错了:limit #pageNo#,#pageSize# 后来查资料才知道 limit 后面不应该用#&#xff08;我传进来的是Intege…