第17章:使用 concurrent.futures 模块处理并发-ThreadPoolExecutor 多线程并发和 Future 介绍

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

本章主要讨论 Python 3.2 引入的 concurrent.futures 模块。这一章还会介绍“Future”的概念,Future 指一种对象,表示异步执行的操作。这个概念的作用很大,是 concurrent.futures 模块和 asyncio 包的基础。

17.1 使用 concurrent.futures 模块并发处理下载任务

为了高效处理网络 I/O,需要使用并发,因为网络有很高的延迟,所以为了不浪费 CPU 周期去等待,最好在收到网络响应之前做些其他的事。为了说明这一点,我们通过代码来示例:

示例 17-1-1 普通批量下载:依次循环从网上下载 20 个国家的国旗图像:

# 可以从输出结果中看到,下载 20 个国旗图片共计用时 15.41s,示例中没有什么新知识,只是与其他脚本对比的基准;

import os
import sys
import time

import requests

# 国家简称列表
POP20_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'

# 保存地址
DOWN_DIR = 'downloads/'


def download_flag(cc):
    """下载国旗"""

    # 图片地址
    url = f'{BASE_URL}/{cc.lower()}/{cc.lower()}.gif'

    image = requests.get(url).content

    # 下载完成打印出国家
    print(cc, end=' ')
    # 刷新控制台
    sys.stdout.flush()

    # 保存图片
    path = os.path.join(DOWN_DIR, cc + '.gif')
    with open(path, 'wb') as fp:
        fp.write(image)

    # 返回国家简称
    return cc


def batch_downloads():
    """批量下载"""

    down_list = []
    for country in sorted(POP20_CC):
        cc = download_flag(country)
        down_list.append(cc)

    return down_list


def main():
    """开始下载并计算下载所需时间"""
    
    start_time = time.tim
concurrent.futures模块ThreadPoolExecutor、ProcessPoolExecutor讲解及使用实例 阅读详情

相关推荐

Python的concurrent.futuresThreadPoolExecutor线程池 ProcessPoolExecutor(进程池)

示了如何使用 ThreadPoolExecutor ProcessPoolExecutor 来并行执行多个任务。ThreadPoolExecutor 适用于I/O密集型任务(如网络请求、文件读写等),而 ProcessPoolExecutor 更适合CPU密集型任务。然而,对于网络请求,由于GIL的存在对线程的影响较小,并且进程间通信的开销通常比线程间通信要大,因此在实际应用中,ThreadPoolExecutor 可能是更合适的选择。

qiy_icbc的博客 2004

concurrent.futures.ThreadPoolExecutor并发库详解

concurrent.futures Python3.2带来的新版功能。是Python并发执行的标准库。 这个模块具有线程池进程池、管理并行编程任务、处理非确定性的执行流程、进程/线程同步等功能。 concurrent.futures 是两个文件放在一起作为这个模块,因为concurrent文件夹下只有futures这个文件夹,而futures下有两个主要文件thread.pyproces...

漫步量化 9205

17使用 concurrent.futures 模块处理并发-阻塞型 I/O GIL、使用 ProcessPoolExecutor 启动进程

17.2 阻塞型I/OGIL CPython 解释器本身就不是线程安全的,因此有全局解释器锁(GIL), 一次只允许使用一个线程执行 Python 字节码。因此,一个 Python 进程通常不能同时使用多个 CPU 核心。 编写 Python 代码时无法控制 GIL;不过,执行耗时的任务时,可以使用一个内置的函数或一个使用 C 语言编写的扩展释放 GIL。其实,有个使用 C 语言编写的 Python 库能管理 GIL,自行启动操作系统线程,利用全部可用的 CPU 核心。这样做会极大地增加库代码的复杂度

waitan2018的博客 1516

Python:ThreadPoolExecutor介绍示例

ThreadPoolExecutor是Python标准库concurrent.futures中的一个类,它提供了一种方便的方式来使用线程池,从而实现并发执行任务的目的。使用ThreadPoolExecutor可以避免手动管理线程的复杂性,同时可以利用现代CPU的多核心能力,提高程序的运行效率。

Danica的博客 6202

Python多线程线程池(python线程池ThreadPoolExecutorconcurrent.futures高级别异步执行封装

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

Dontla的博客 1万+

Python 使用期物处理并发(使用concurrent.futures模块下载)

concurrent.futures 模块的主要特色是 ThreadPoolExecutor ProcessPoolExecutor 类,这两个类实现的接口能分别在不同的线程或进程中执行可调用的对象。这两个类在内部维护着一个工作线程或进程池,以及要执行的任务队列。不过,这个接口抽象的层级很高,像下载国旗这种简单的案例,无需关心任何实现细节。示例 17-3 展示如何使用 ThreadPoolExecutor.map 方法,以最简单的方式实现并发下载。

钢铁男儿 891

python异步并发模块concurrent.futures入门详解

目录 1. 模块安装 2. concurrent.futures模块详解 3. 附录:PythonGIL相关 4. 参考文档 concurrent.futures是一个非常简单易用的库,主要用来实现多线程多进程的异步并发。 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo。 回到目录 1. 模块安装 1) python 3.x中自...

bang152101的博客 1463

17使用 concurrent.futures 模块处理并发-使用 futures.as_completed 函数立刻获取多线程任务执行结果

前面的节我们使用了Executor.map 函数,这个函数易于使用,不过有个特性可能有用,也可能没用, 具体情况取决于需求:这个函数返回结果的顺序与调用开始的顺序一致。 我们知道map 返回的结果是一个生成器 results,当我们用 for 循环取值时, for 会隐式调用 next(results) 返回第一个任务,然后又会在第一个任务的 Future实例上调用 .result() 方法。而 result() 方法会阻塞,直到第一个Future 运行结束;如果第一个调用生成结果用时 10 秒...

waitan2018的博客 5558

python 异步并发_python异步并发模块concurrent.futures入门详解

concurrent.futures是一个非常简单易用的库,主要用来实现多线程多进程的异步并发。本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo。1. 模块安装1) python 3.x中自带了concurrent.futures模块2) python 2.7需要安装futures模块使用命令pip install futures安装即可2. c...

weixin_39615402的博客 559

Fluent Python 笔记 第 17 使用 future 处理并发

future 指一种对象,表示异步执行的操作。这个概念的作用很大,是 concurrent.futures 模块 asyncio 包(第 18 讨论)的基础。 17.1.3 future 在哪里 从 Python 3.4 起,标准库中有两个名为 Future 的 类: 。这两个类的作用相同:两个 Future 类的实例都表示可能已经完成或者尚未完成的延迟计算。通常情况下自己不应该创建 。这两种 都有 方法,这个方法不阻塞,返回值是布尔值,指明 链接的 可调用对象是否已经执行。客户端代码通常不会

zhangchaosd的博客 676

python异步模块_python异步并发模块concurrent.futures入门详解

concurrent.futures是一个非常简单易用的库,主要用来实现多线程多进程的异步并发。本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo。1. 模块安装1) python 3.x中自带了concurrent.futures模块2) python 2.7需要安装futures模块使用命令pip install futures安装即可2. c...

weixin_39854681的博客 268

python异步并发模块concurrent.futures简析

本文主要介绍python异步并发模块concurrent.futures。它非常简单易用,主要用来实现多线程多进程的异步并发。 1. 模块安装 1) python 3.x中自带了concurrent.futures模块 2) python 2.7需要安装futures模块使用命令pip install futures安装即可 pypi地址:https://pyp

mojolang 4695

读书笔记:《流畅的Python》第17 使用future处理并发

# 第17 使用future处理并发 """ 内容提要: concurrent.futures模块 future的概念:是一种对象,表示异步执行的操作 是concurrent.futuresasynicio包的基础 """ # 17.1 网络下载的三种风格 # 17.1.1 依序下载的脚本 # 依序下载的脚本,另外两个版本会重用其中的几个函数 flags.py # 17.1.2 使用concurrent.futures模块下载 """ 只要是使用了 Thread.

Morbidmuse的博客 752

Python通过future处理并发

python通过future处理并发 future初识 通过下面脚本来对future进行一个初步了解:例子1:普通通过循环的方式 1 import os 2 import time 3 import sys 4 5 import requests 6 7 8 POP20_CC = ( 9 "CN IN US ID BR PK N...

weixin_30609287的博客 139

python asyncio future_Python通过future处理并发

future初识通过下面脚本来对future进行一个初步了解:例子1:普通通过循环的方式1 importos2 importtime3 importsys45 importrequests678 POP20_CC =(9 "CN IN US ID BR PK NG BD RU JP MX PH VN ET EG DE IR TR CD FR"10 ).split()111213 BASE_...

weixin_39665847的博客 288

python concurrent 模块

concurrent 介绍登录后复制 concurrent.futures 是 Python 中的一个模块,提供了一个高级接口,用于异步执行函数或方法。 concurrent.futures 提供了2个池执行器: ThreadPoolExecutor:该类使用一组线程来异步执行调用。它适用于 I/O 密集型操作或不是...

weixin_40513133的博客 260

python3源码剖析之concurrent.futures.ThreadPoolExecutor

0x00 文档路径: Python » 3.6.2 Documentation » The Python Standard Library » 17. Concurrent Execution » 0x01 模块简述:添加于python3.2提供更加高效的接口来实现异步执行通过具体实现来剖析0x02 具体实现参考官方文档给出的例子from concurrent.futures import Thr

Teagle的博客 3087

ThreadPoolExecutor使用浅谈

是Python标准库模块中的一个类,用于实现线程池的功能。模块相比于threading等模块,通过submit方法返回的是一个Future对象,它代表了一个未来可期的结果。通过Future对象,我们可以在主线程(或主进程)中获取某个线程(或任务)的状态以及返回值,实现了多线程多进程编码接口的一致性。具体来说,Future获取状态返回值:通过result()方法可以获取一个任务的执行结果。如果任务尚未完成,调用result()方法会阻塞主线程,直到任务完成并返回结果。异步通知。

Gefangenes的博客 1025

流畅python学习笔记:第十七并发处理

第十七并发处理主要讨论Python3引入的concurrent.futures模块。在python2.7中需要用pip install futures来安装。concurrent.futures 是python3新增加的一个库,用于并发处理,提供了多线程多进程的并发功能类似于其他语言里的线程池(也有一个进程池),他属于上层的封装,对于用户来说,不用在考虑那么多东西了。 ...

dianjie9145的博客 184
上一篇: 第16章:协程
下一篇: 第17章:使用 concurrent.futures 模块处理并发-阻塞型 I/O 和 GIL、使用 ProcessPoolExecutor 启动进程
waitan2018
博客等级 码龄8年 229粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值