python并发编程: Python好用的线程池ThreadPoolExecutor

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: python并发编程: Python好用的线程池ThreadPoolExecutor

往期文章:

  1. 并发编程简介
  2. 怎样选择多线程多进程多协程
  3. Python速度慢的罪魁祸首,全局解释器锁GIL
  4. 使用多线程,Python爬虫被加速10倍
  5. Python实现生产者消费者爬虫
  6. Python线程安全问题以及解决方案

线程池概念介绍

上图左侧是展示的是一个线程的生命周期,首先,新建线程,然后准备就绪,等cpu调用,如果被调用,则开始运行,如果被切换,则又返回就绪状态,如果是因为io或者sleep,则进入阻塞状态,阻塞结束则又回到就绪状态,反反复复,直到执行完。之所以要采用线程池,右上角以说明原因。

线程池的好处:

  • 提升性能:因为减去了大量新建、终止线程的开销,重用了线程资源;
  • 适用场景:适合处理突发性大量请求或需要大量线程完成任务、但实际任务处理时间较短
  • 防御功能:能有效避免系统因为创建线程过多,而导致系统负荷过大相应变慢等问题
  • 代码优势:使用线程池的语法比自己新建线程执行线程更加简洁

线程池的使用方法

  • 用法一: map函数,很简单。
    ```python
    from concurrent.futures import ThreadPoolExecutor,as_completed

with ThreadPoolExecutor() as pool:
results = pool.map(craw,urls)
for result in results:
print(result)


> 注意map的结果和入参是顺序对应的。


- 用法二: futures模式,更强大。

```python
from concurrent.futures import ThreadPoolExecutor,as_completed

with ThreadPoolExecutor() as pool:
     futures = [ pool.submit(craw,url)  for url in urls]

     for future in futures:
        print(future.result())

     for future in as_completed(futures):
        print(future.result())

注意如果用as_completed顺序是不定的。

使用线程池改造爬虫程序

import concurrent.futures
import cnblogs_spider


#craw 
with concurrent.futures.ThreadPoolExecutor() as pool:
    htmls = pool.map(cnblogs_spider.craw,cnblogs_spider.urls)
    htmls = list(zip(cnblogs_spider.urls,htmls))
    for url,html in htmls:
        print(url,len(html))

#parse
with concurrent.futures.ThreadPoolExecutor() as pool:
    futures = {
   
   }
    for url,html in htmls:
        future = pool.submit(cnblogs_spider.parse,html)
        futures[future] = url

    #for future,url in futures.items():
    #    print(url,future.result())
    for future in concurrent.futures.as_completed(futures):
        url = futures[future]
        print(url,future.result())
目录
相关文章
|
23天前
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
在Python的并发编程世界中,没有万能的解决方案,只有最适合特定场景的方法。希望本文能够为你拨开迷雾,找到那条通往高效并发编程的光明大道。
34 2
|
1天前
|
数据采集 Java Python
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
在信息化时代,实时数据的获取对体育赛事爱好者、数据分析师和投注行业至关重要。本文介绍了如何使用Python的`ThreadPoolExecutor`结合代理IP和请求头设置,高效稳定地抓取五大足球联赛的实时比赛信息。通过多线程并发处理,解决了抓取效率低、请求限制等问题,提供了详细的代码示例和解析方法。
如何用Python同时抓取多个网页:深入ThreadPoolExecutor
|
3天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
10天前
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
python知识点100篇系列(16)-python中如何获取线程的返回值
|
17天前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
21 3
|
20天前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
39 3
|
21天前
|
数据处理 Python
深入探索:Python中的并发编程新纪元——协程与异步函数解析
深入探索:Python中的并发编程新纪元——协程与异步函数解析
20 3
|
22天前
|
数据采集 数据处理 调度
探索Python的并发编程
本文深入探讨Python中的并发编程,包括线程、进程和异步I/O。通过实例展示如何有效利用这些工具提升程序性能,并讨论在应用中需注意的问题及最佳实践。
|
2天前
|
安全 数据处理 开发者
Python中的多线程编程:从入门到精通
本文将深入探讨Python中的多线程编程,包括其基本原理、应用场景、实现方法以及常见问题和解决方案。通过本文的学习,读者将对Python多线程编程有一个全面的认识,能够在实际项目中灵活运用。
|
13天前
|
网络协议 安全 Java
难懂,误点!将多线程技术应用于Python的异步事件循环
难懂,误点!将多线程技术应用于Python的异步事件循环
40 0