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

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
大数据开发治理平台 DataWorks,不限时长
简介: 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())
目录
相关文章
|
4天前
|
Python
|
6天前
|
存储 缓存 安全
【并发编程】线程池以及场景题
【并发编程】线程池以及场景题
22 0
|
6天前
|
存储 监控 安全
【并发编程】线程安全(下)
【并发编程】线程安全
10 0
|
6天前
|
存储 安全 Java
【并发编程】线程安全(上)
【并发编程】线程安全
14 0
|
6天前
|
Java 程序员 调度
【并发编程】线程基础知识
【并发编程】线程基础知识
11 0
|
6天前
|
安全 调度 Python
探索Python中的并发编程:协程与多线程的比较
本文将深入探讨Python中的并发编程技术,重点比较协程与多线程的特点和应用场景。通过对协程和多线程的原理解析,以及在实际项目中的应用案例分析,读者将能够更好地理解两种并发编程模型的异同,并在实践中选择合适的方案来提升Python程序的性能和效率。
|
1天前
|
机器学习/深度学习 数据采集 自然语言处理
2024年Python最新【python开发】并发编程(下),2024年最新字节跳动的面试流程
2024年Python最新【python开发】并发编程(下),2024年最新字节跳动的面试流程
2024年Python最新【python开发】并发编程(下),2024年最新字节跳动的面试流程
|
2天前
|
Java
Java一分钟之-并发编程:线程间通信(Phaser, CyclicBarrier, Semaphore)
【5月更文挑战第19天】Java并发编程中,Phaser、CyclicBarrier和Semaphore是三种强大的同步工具。Phaser用于阶段性任务协调,支持动态注册;CyclicBarrier允许线程同步执行,适合循环任务;Semaphore控制资源访问线程数,常用于限流和资源池管理。了解其使用场景、常见问题及避免策略,结合代码示例,能有效提升并发程序效率。注意异常处理和资源管理,以防止并发问题。
25 2
|
2天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
17 2
|
4天前
|
Java 测试技术 Python
Python的多线程允许在同一进程中并发执行任务
【5月更文挑战第17天】Python的多线程允许在同一进程中并发执行任务。示例1展示了创建5个线程打印"Hello World",每个线程调用同一函数并使用`join()`等待所有线程完成。示例2使用`ThreadPoolExecutor`下载网页,创建线程池处理多个URL,打印出每个网页的大小。Python多线程还可用于线程间通信和同步,如使用Queue和Lock。
19 1