Python 线程池 ThreadPoolExecutor(一)

零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门


一.Python 线程池前言

     在前面的文章中我们已经介绍了很多关于 Python 线程相关的知识点,比如 线程互斥锁 Lock / 线程事件 Event / 线程条件变量 Condition 等等,而今天给大家讲解的是 线程池ThreadPoolExecutor,可能很多小伙伴会疑惑,threading 模块能创建线程,ThreadPoolExecutor 也能创建线程,两者都有什么区别呢?

     众所周知,程序中使用线程会提高运行效率,虽然线程是计算机的最小单位,但是线程的创建和使用一样会占用计算机资源和产生开销,一旦创建成千上万的线程,计算机一样会死机!一个合理的程序永远都是以消耗最少的资源干最多的事,就像公司老板,永远都想以最少的钱,招最少的人,干最多的事!

Python 线程池 ThreadPoolExecutor(一)

                                                                                    哪个二货在背后说我


二.Python 线程池原理

     大家都使用过迅雷下载,当同时下载 1000 个任务甚至更多的时候,就算开通 vip 同时下载的数量也只有 8 个。如果同时创建 1000 个线程,首先对计算器的开销也很大,而且每次只运行 8 个线程,需要不停的创建和销毁,这样会显得很麻烦。

     而使用线程池 ThreadPoolExecutor 就可以解决上面的问题,其实只需要 8 个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行,这就是所谓的线程池 ThreadPoolExecutor 原理!

Python 线程池 ThreadPoolExecutor(一)

三.Python 线程池 ThreadPoolExecutor 函数介绍

  •      1.ThreadPoolExecutor 构造实例的时候,传入 max_workers 参数来设置线程池中最多能同时运行的线程数目。
  •      2.使用 submit 函数来提交线程需要执行的任务(函数名和参数)到线程池中,并返回该任务的句柄(类似于文件、画图),注意 submit 不是阻塞的,而是立即返回。
  •      3.通过 submit 函数返回的任务句柄,能够使用 done 方法判断该任务是否结束。下面的例子可以看出,由于任务有 2s 的延时,在 task1 提交后立刻判断, task1 还未完成,而在延时 4s 之后判断,task1 就完成了。
  •      4.使用 cancel 方法可以取消提交的任务,如果任务已经在线程池中运行了,就取消不了。这个例子中,线程池的大小设置为 2 ,任务已经在运行了,所以取消失败。如果改变线程池的大小为 1 ,那么先提交的是 task1,task2 还在排队等候,这是时候就可以成功取消。
  •      5.使用 result 方法可以获取任务的返回值,注意:这个方法是阻塞的。

四.Python 线程池 ThreadPoolExecutor 简单使用

# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:猿说编程
@Blog(个人博客地址): www.codersrc.com
@File:Python 线程池 ThreadPoolExecutor.py
@Time:2021/05/05 07:37
@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
 
"""

from concurrent.futures import ThreadPoolExecutor
import time

# 参数times用来模拟下载的时间
def down_video(times):
    time.sleep(times)
    print("down video {}s finished".format(times))
    return times

executor = ThreadPoolExecutor(max_workers=2)
# 通过submit函数提交执行的函数到线程池中,submit函数立即返回,不阻塞
task1 = executor.submit(down_video, (3))
task2 = executor.submit(down_video, (2))
# done方法用于判定某个任务是否完成
print("任务1是否已经完成:",task1.done())
# cancel方法用于取消某个任务,该任务没有放入线程池中才能取消成功
print("取消任务2:",task2.cancel())
time.sleep(4)
print("任务1是否已经完成:",task1.done())
# result方法可以获取task的执行结果
print(task1.result())


'''
输出结果:

任务1是否已经完成: False
取消任务2: False
down video 2s finished
down video 3s finished
任务1是否已经完成: True
3
'''

     线程池 ThreadPoolExecutor 使用远不止如此,由于篇幅有限,关于线程池 as_completed / map / wait 函数和线程池的阻塞和执行顺序相关介绍请参考Python 线程池ThreadPoolExecutor(二)


五.猜你喜欢

  1. Python 条件推导式
  2. Python 列表推导式
  3. Python 字典推导式
  4. Python 函数声明和调用
  5. Python 不定长参数 *argc/**kargcs
  6. Python 匿名函数 lambda
  7. Python return 逻辑判断表达式
  8. Python 字符串/列表/元组/字典之间的相互转换
  9. Python 局部变量和全局变量
  10. Python type 函数和 isinstance 函数区别
  11. Python is 和 == 区别
  12. Python 可变数据类型和不可变数据类型
  13. Python 浅拷贝和深拷贝
  14. Python 文件读写操作
  15. Python 异常处理
  16. Python 模块 import
  17. Python __name__ == ‘__main__’详细解释
  18. Python 线程创建和传参
  19. Python 线程互斥锁 Lock
  20. Python 线程事件 Event
  21. Python 线程条件变量 Condition
  22. Python 线程定时器 Timer
  23. Python 线程信号量 Semaphore
  24. Python 线程障碍对象 Barrier
  25. Python 线程队列 Queue – FIFO
  26. Python 线程队列 LifoQueue – LIFO
  27. Python 线程优先队列 PriorityQueue

未经允许不得转载:猿说编程 » Python 线程池 ThreadPoolExecutor(一)
喜欢(3) 打赏

评论抢沙发

评论前必须登录!

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!!

开始学习

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏