浅谈python线程池

本文详细介绍了Python线程池的使用,包括ThreadPoolExecutor和ProcessPoolExecutor,讲解了submit、map、shutdown等方法,以及如何通过Future获取线程任务结果。通过实例展示了result和add_done_callback方法的不同用法,并提供了多参数线程任务的执行示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python线程池的使用

python的多线程管理一直很麻烦,可能是我基础不够好,这里记录并分享以下python的线程池管理
在网上查了一个线程池的使用资料,个人感觉不是很清晰 但是重点很到位,
原文链接请点这里

调试使用的库

from concurrent.futures import ThreadPoolExecutor
import threading
import time

1、库描述
线程池的基类是 concurrent.futures 模块中的 Executor,Executor 提供了两个子类,即 ThreadPoolExecutor 和 ProcessPoolExecutor,其中 ThreadPoolExecutor 用于创建线程池,而 ProcessPoolExecutor 用于创建进程池。
如果使用线程池/进程池来管理并发编程,那么只要将相应的 task 函数提交给线程池/进程池,剩下的事情就由线程池/进程池来搞定。
2、方法描述
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):关闭线程池。

注意:
其中如果单线程方法需要传入多个参数的话,在submit(方法名,参数1,参数2…)填入多个参数即可
用完一个线程池后,应该调用该线程池的 shutdown() 方法,该方法将启动线程池的关闭序列。调用 shutdown() 方法后的线程池不再接收新任务,但会将以前所有的已提交任务执行完成。当线程池中的所有任务都执行完成后,该线程池中的所有线程都会死亡。

3、线程池执行函数
程序将 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 函数。

注意:
result(timeout=None):该方法描述的很清楚,会阻塞主线程的使用,基本在我的理解中,我们使用场景里是不会使用该方法的。
add_done_callback(fn):该方法作用为等待所有的线程执行完毕后把所有的线程返回值存储到一个列表中,遍历此列表即为执行完毕后的线程执行结果。

4、实例一,使用result调用线程方法返回值,
可以明确主线程会阻塞,如果直接看文章表现的不清晰,可以加一个时间戳打印,或者手动运行一下,可以明确感知到线程的先后运行顺序。

# -*-coding:utf-8-*-
from concurrent.futures import ThreadPoolExecutor
import threading
import time

def action(max,idx):
    start_time=time.time()
    my_sum =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值