1. 基础介绍

ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能。

ThreadPoolExecutor模块相比于threading等模块,通过submit方法返回的是一个Future对象,它代表了一个未来可期的结果。通过Future对象,我们可以在主线程(或主进程)中获取某个线程(或任务)的状态以及返回值,实现了多线程和多进程编码接口的一致性。

具体来说,Future对象具有以下特点:

  1. 获取状态和返回值:通过result()方法可以获取一个任务的执行结果。如果任务尚未完成,调用result()方法会阻塞主线程,直到任务完成并返回结果。

  2. 异步通知:当一个线程完成时,主线程可以立即得到通知。可以通过done()方法判断任务是否已完成,或使用add_done_callback()方法注册一个回调函数,在任务完成时自动调用该函数。

  3. 异常处理:如果任务抛出异常,Future对象会将异常抛出到主线程。可以使用exception()方法获取异常对象。

通过返回Future对象,我们可以更方便地管理和控制线程池中的任务。可以在主线程中获取任务的状态、返回值和异常信息,避免了线程之间的显式同步和等待。

总的来说,ThreadPoolExecutor模块提供了一种高级的多线程编程接口,使得多线程编程更加简洁和易用。它实现了多线程和多进程的编码接口一致性,使得我们可以使用类似的方式处理多线程和多进程编程任务。

2. 基础使用

创建线程池对象

可以使用ThreadPoolExecutor类创建一个线程池对象。可以指定线程池的大小(即可同时运行的线程数量),也可以使用默认值(大小为系统默认的处理器数量)。

from concurrent.futures import ThreadPoolExecutor
import time def get_html(times):
time.sleep(times)
print("get page {} success".format(times))
return times executor = ThreadPoolExecutor(max_workers=2) # 表示在这个线程池中同时运行的线程有3个线程

提交任务

使用submit()方法向线程池提交任务,该方法接受一个可调用对象(函数、方法等)作为参数,并返回一个Future对象,表示异步执行的结果。

def my_task(arg):
# 执行任务的代码
return result # 提交任务到线程池
future = executor.submit(my_task, arg)

获取任务结果

可以使用Future对象的result()方法来获取任务的结果。如果任务尚未完成,result()方法会阻塞当前线程,直到任务完成并返回结果。

# 获取任务的结果
result = future.result()

获取一组任务结果

使用submit()方法向线程池提交一组任务,并获取返回的Future对象列表,使用as_completed()函数迭代处理Future对象列表,它会在任务完成时产生结果。可以使用next()函数或直接使用for循环来获取结果

def my_task(arg):
# 执行任务的代码
return result args = [arg1, arg2, arg3, ...]
futures = [executor.submit(my_task, arg) for arg in args] # 使用next()函数获取每个任务的结果
for future in as_completed(futures):
result = future.result()
# 处理任务结果 # 或者使用for循环获取每个任务的结果
for future in as_completed(futures):
result = future.result()
# 处理任务结果

批量提交任务

除了逐个提交任务,还可以使用map()方法批量提交任务。map()方法接受一个可调用对象和一个可迭代的参数列表,然后并行地对参数列表中的每个参数调用可调用对象,并返回一个迭代器,用于获取每个任务的结果。

def my_task(arg):
# 执行任务的代码
return result args = [arg1, arg2, arg3, ...] # 批量提交任务并获取结果
results = executor.map(my_task, args)

等待任务完成

使用wait()方法等待所有已提交的任务完成。可以指定超时时间,如果超时时间到达而还有任务未完成,则不再等待并返回结果。

from concurrent.futures import ALL_COMPLETED, FIRST_COMPLETED

# 等待所有任务完成
executor.wait(futures) # 等待任意任务完成
executor.wait(futures, return_when=FIRST_COMPLETED) # 等待所有任务完成或达到超时时间(单位为秒)
executor.wait(futures, timeout=10)

wait()方法接受三个参数:

  • fs:要等待的Future对象列表。
  • timeout:可选参数,指定等待的超时时间(单位为秒)。如果超时时间到达而还有任务未完成,则不再等待并返回结果。
  • return_when:可选参数,指定返回结果的条件。默认为ALL_COMPLETED,表示等待所有任务完成;也可以指定为FIRST_COMPLETED,表示等待任意一个任务完成。

关闭线程池

在不再需要线程池时,应该调用shutdown()方法关闭线程池。关闭线程池后,将不再接受新的任务提交,但会等待已提交的任务完成。

# 关闭线程池
executor.shutdown()

  

ThreadPoolExecutor使用浅谈的更多相关文章

  1. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  2. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  3. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  4. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  5. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  6. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  7. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  8. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  10. 浅谈Hybrid技术的设计与实现第三弹——落地篇

    前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...

随机推荐

  1. 2023年郑州轻工业大学校赛邀请赛mjh

    首先,很感谢老师的信任,选择我去参加此次比赛:其次,感谢wh,wyh两位队友的全程带飞.此次比赛是我第一次参加线下的比赛活动,内心难免激动与紧张. 比赛开始,队友直接找到了签到题进行解答,而我拿到了看 ...

  2. 【WebGL系列-04】清除缓冲区并绘制图形

    清除缓冲区并绘制图形 前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理. 清除缓冲区 由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜 ...

  3. 学习lspci:总线

    00:00.0 Host bridge 总线地址 00:00.0 是指PCI总线上的第一个设备,也称为根复杂性总线.在PCI架构中,每个设备都有唯一的总线地址,由域号.总线号.设备号和功能号组成.其中 ...

  4. 安装centos系统,硬盘检测报错:修改BIOS为 Legacy

    进bios,将模式修改为legacy. 硬盘使用 MBR 分区,需要用 Legacy BIOS 启动,而不是 UEFI BIOS . 至于为什么安装的时候会报错? 可能是系统有这方面限制.也可能是别的 ...

  5. 01-jQuery的基本结构

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 一文搞懂TCP的三次握手和四次挥手

    目录 1.三次握手 2.四次挥手 3.11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开. 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所 ...

  7. ModuleNotFoundError: No module named 'requests' 解决办法

    问题记录:运行python程序时,出现报错:ModuleNotFoundError: No module named 'requests' 问题原因:没有安装requests库 解决办法:安装requ ...

  8. Python 潮流周刊#15:如何分析 FastAPI 异步请求的性能?

    你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中一则分享,不代表全部内容都是该主题,特此声明. 本周刊精心筛选国内外的 250+ 信息源,为你挑选最值 ...

  9. 5、Mybatis之获取参数值

    5.1.创建新module 5.1.1.右击SSM文件夹,创建新module 5.1.2.选择maven 5.1.3.配置module名称和路径 5.1.4.module初始状态 5.1.5.复制打包 ...

  10. ChatGPT应用篇:如何快速生成精美PPT提高工作效率-附资料下载

    一.ChatGPT生成markdown源代码 问: 我想做一份ChatGPT变现方法的PPT,请生成丰富的教学展示内容,因为生成PPT是需要MarkDown格式的,请您输出Markdown格式的内容 ...