python线程池及其原理和使用

  • 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互。在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池。
  • 线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。

此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python 解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数。

线程池的使用

  • 线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即
    ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor
    用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。

如果使用线程池/进程池来管理并发编程,那么只要将相应的 task 函数提交给线程池/进程池,剩下的事情就由线程池/进程池来搞定。

Exectuor 提供了如下常用方法:

  • submit(fn, *args, **kwargs):将 fn 函数提交给线程池。*args 代表传给 fn 函数的参数,*kwargs
    代表以关键字参数的形式为 fn 函数传入参数。 map(func, *iterables, timeout=None,
    chunksize=1):该函数类似于全局函数 map(func, *iterables),只是该函数将会启动多个线程,以异步方式立即对
    iterables 执行 map 处理。 shutdown(wait=True):关闭线程池。
  • 程序将 task 函数提交(submit)给线程池后,submit 方法会返回一个 Future 对象,Future
    类主要用于获取线程任务函数的返回值。由于线程任务会在新线程中以异步方式执行,因此,线程执行的函数相当于一个“将来完成”的任务,所以
    Python 使用 Future 来代表。

Future 提供了如下方法:

  • cancel():取消该 Future 代表的线程任务。如果该任务正在执行,不可取消,则该方法返回
    False;否则,程序会取消该任务,并返回 True。

  • cancelled():返回 Future 代表的线程任务是否被成功取消。

  • running():如果该 Future 代表的线程任务正在执行、不可被取消,该方法返回 True。

  • done():如果该 Funture 代表的线程任务被成功取消或执行完成,则该方法返回 True。

  • result(timeout=None):获取该 Future 代表的线程任务最后返回的结果。如果 Future
    代表的线程任务还未完成,该方法将会阻塞当前线程,其中 timeout 参数指定最多阻塞多少秒。

  • exception(timeout=None):获取该 Future
    代表的线程任务所引发的异常。如果该任务成功完成,没有异常,则该方法返回 None。

  • add_done_callback(fn):为该 Future 代表的线程任务注册一个“回调函数”,当该任务成功完成时,程序会自动触发该
    fn 函数。

在用完一个线程池后,应该调用该线程池的 shutdown() 方法,该方法将启动线程池的关闭序列。调用 shutdown() 方法后的线程池不再接收新任务,但会将以前所有的已提交任务执行完成。当线程池中的所有任务都执行完成后,该线程池中的所有线程都会死亡。

使用线程池来执行线程任务的步骤如下:

  • 调用 ThreadPoolExecutor 类的构造器创建一个线程池。 定义一个普通函数作为线程任务。
  • 调用 ThreadPoolExecutor 对象的 submit() 方法来提交线程任务。 当不想提交任何任务时,调用
    ThreadPoolExecutor 对象的 shutdown() 方法来关闭线程池。
    ThreadPoolExecutor(线程池)

线程池一些知识点:

  1. python中ThreadPoolExecutor(线程池)是concurrent.futures模块下的,主线程中可以获取某一个线程执行的状态或者某一个任务执行的状态及返回值。
  2. 通过submit返回的是一个future对象,它是一个未来可期的对象,通过它可以获悉线程的状态
  3. 通过submit提交函数到进程池中,submit(函数名,参数)
  4. 通过wait()判断线程执行的状态:wait(fs, timeout=None,
    return_when=ALL_COMPLETED),wait接受3个参数,fs表示执行的task序列;timeout表示等待的最长时间,超过这个时间即使线程未执行完成也将返回;return_when表示wait返回结果的条件,默认为ALL_COMPLETED全部执行完成再返回
    http的是IO请求,所以用线程
    编写方法一:直接返回处理
from concurrent.futures import ThreadPoolExecutor
import requestspool = ThreadPoolExecutor(10)def task(url):response = requests.get(url)print(url,response)url_list = ("https://www.bing.com","https://www.shihu.com","https://www.sina.com","https://www.baidu.com","https://www.cnblogs.com","https://music.163.com/#"
)for url in url_list:pool.submit(task,url)pool.shutdown(wait=True)

result

https://www.bing.com <Response [200]>
https://www.baidu.com <Response [200]>
https://www.cnblogs.com <Response [200]>
https://music.163.com/# <Response [200]>
https://www.sina.com <Response [200]>

编写方法二:通过回调函数进行处理

from concurrent.futures import ThreadPoolExecutor
import requestspool = ThreadPoolExecutor(10)def task(url):response = requests.get(url)   #下载页面return responsedef done(future,*args,**kwargs):response = future.result()   #取得future对象进行操作print(response.status_code,response.content)url_list = ("https://www.bing.com","https://www.jd.com","https://www.sina.com","https://www.baidu.com","https://www.cnblogs.com","https://music.163.com/#"
)for url in url_list:v = pool.submit(task,url)    #获得一个返回值,其实就是访问url的响应v.add_done_callback(done)

python线程池原理及使用相关推荐

  1. python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

    概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器 ...

  2. dict实现原理 python_5分钟看懂系列:Python 线程池原理及实现

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 概述 传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创 ...

  3. python线程池原理_Python定时器线程池原理详解

    这篇文章主要介绍了Python定时器线程池原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 定时器执行循环任务: 知识储备 Timer(int ...

  4. python线程池原理_Django异步任务线程池实现原理

    这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改 ...

  5. python线程池原理_Python3线程池ThreadPoolExecutor总结

    是什么 如何用 常用方法一:with ThreadPoolExecutor as t: t.submit import concurrent.futures import urllib.request ...

  6. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...

  7. 线程池原理及python实现

    https://www.cnblogs.com/goodhacker/p/3359985.html 为什么需要线程池 目前的大多数网络服务器,包括Web服务器.Email服务器以及数据库服务器等都具有 ...

  8. Python学习:线程池原理及实现

    传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于 ...

  9. python线程池使用和问题记录

    记录一次使用多线程的问题 背景 最近工作有个需求根据文件中的数据请求中台服务,然后解析返回值.文件中每行代表一个参数,使用post方式携带参数请求中台接口. 分析:需要处理的数据量非常大(近200w行 ...

最新文章

  1. 《智能交通》正式出版发行,系国内首部全面阐述智能交通“中国模式”专著
  2. gitlab增加日志
  3. SAP Spartacus cxOutlet 里的 templatesRefs 的填充逻辑
  4. 数据库建表练习(10.11作业)
  5. [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
  6. linux系统时间函数,Linux时间时区详解与常用时间函数
  7. php mysql安装_搭建PHP环境中的MySQL配置
  8. 朱福喜 java_与朱福喜的教科同步JAVA实验指导书
  9. JUnit for Android入门1
  10. 【2018-2019 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) D】Count The Bits【数位DP】
  11. 极限数学计算机在线使用,健身最大重复次数(RM)在线计算器
  12. c语言 上传图片至服务器,JSP+Servlet实现文件上传到服务器功能
  13. VML编辑器代码实现(转载)
  14. 2022-2027年(新版)中国大米行业营销战略与供应情况预测报告
  15. 哈工大计算机系名单,哈工大计算机学部公布拟录取名单,计算机科学与技术仅录29人!...
  16. 【Windows】win10多桌面与多任务
  17. MySQL基础--MySQL数据库基本操作
  18. Oracle DataGuard介绍
  19. [2018 NUIST 程序设计竞赛] A. 竹鼠的命运
  20. 人体运动学非线性分析(一)—熵特征

热门文章

  1. ViewPager实现左右无限循环效果
  2. 解决安装文件时2502、2503错误
  3. vi复制粘贴(转贴+自己总结)
  4. 利用poi 读取excel通用工具类
  5. 深度学习入门-神经网络
  6. 如何使用sz命令下载较大文件到本地
  7. 俺也上IPV6了 顺便推荐几个IPV6视频站点
  8. RK3399平台开发系列讲解(其他篇)1.18、瑞芯微 RK3288 芯片介绍
  9. 【python】用turtle画七巧板
  10. 手机cpu什么型号支持鸿蒙系统,华为鸿蒙2.0系统支持的手机型号(图文)