0x01 前言
整个文章将被分多个部分,全面剖析python标准库concurrent.futures模块下的ThreadPoolExecutor类。
第一部分让我们先了解什么是线程池。
(如果想直接了解ThreadPoolExecutor如何使用,不妨直接看(4)ThreadPoolExecutor 例子)
0x02 什么是线程池
既然要了解线程池,不妨先真正理解线程的含义。
线程是操作系统能够进行运算调度的最小单位,被包含在进程之中,是进程中的实际运作单位。
每个 Python 程序都是一个进程,用来执行程序指令,其中至少有一个线程称为主线程。每个进程实际上都是一个解释器执行Python代码的一个实例。
我们知道,CPU的速度远远快于磁盘、网络等IO,例如一个Web漏洞POC中:耗费时间最长的就是等待request响应,这时如果我们创建额外的线程来异步执行任务,就会显著提高效率。
Python标准库提供了threading模块中的Thread类,如果了解异步调用,相信你一定知道这个类,它可以实现简单的、系统级的线程调用。
运行下面例子,创建线程对象来运行task函数。
# Terra 星环
from threading import Thread
import time
# 这是线程函数
def task():
time.sleep(1)
print('这是子线程')
# 创建一个Thread类的实例如下,通过target参数指定线程函数
thread = Thread(target=task)
# 启动线程
thread.start()
# 打印主线程消息
print('这是主线程,等待子线程')
# 等待线程完成
thread.join()
返回结果
这是主线程,等待子线程
这是子线程
0x03 为什么要使用线程池?
像上面例子,一次性简单任务创建一个单独的子线程是有效的,但当你有大量繁重的任务就比较繁琐了。
每个线程创建时都需要系统资源(线程栈空间耗费的内存),如果为了繁重任务一次又一次创建销毁线程,增加系统负担,会适得其反。
所以,如何保留线程以便复用?如何有效管理线程?线程池应运而生。
0x04 什么是线程池
线程池是一种编程方式,用于自动管理多线程。
一个线程池负责固定数量的线程:
-
控制多线程创建时间(使用时创建)
-
控制多线程在闲置期等待,以免耗费系统资源
线程池中每一个线程称工作线程(worker),工作线程的设计目的是在任务完成后可以复用。如果任务中发生异常,线程池还会保护工作线程不受到影响。
线程池提供可以配置工作线程的方法,例如运行一个初始化函数,并使用一个特定的命名规则,命名每个工作线程。
线程池提供一个通用接口,用于给执行的任务传参,且不需要我们选择某个进程,也不需要start(),join()
线程池相比手动管理线程更加效率,尤其是当任务量比较庞大时。
0x05 什么是ThreadPoolExecutor
ThreadPoolExecutor类在Python中能让你创建、管理你的线程池。尽管从python 3.2起,标准库concurrent.futures模块,就提供了ThreadPoolExecutor类,但使用得并不是很广泛,大部分人认为python不适合高并发开发,因为GIL(全局解释器锁),但实际是不是这样,恐怕只有理解透彻了,才能回答这个问题。
后续将详细的全面的探讨ThreadPoolExecutor,包括如何工作,怎么使用,常见问题等,当然,学习代码的最佳方式多敲。
0x06 免责声明
本文仅限于技术研究学习,切勿将文中技术细节用作非法用途,如有违者后果自负。
关于我们
“TERRA星环”安全团队正式成立于2020年,是贵州泰若数字科技有限公司旗下以互联网攻防技术研究为目标的安全团队。团队核心成员长期从事渗透测试、代码审计、应急响应等安服工作,多次参与国家、省级攻防演练行动,具备丰富的安服及攻防对抗经验。
团队专注于漏洞挖掘、漏洞研究、红蓝对抗、CTF夺旗、溯源取证、威胁情报、代码审计、逆向分析等研究。对外提供安全评估、安全培训、安全咨询、安全集成、应急响应等服务。
原文始发于微信公众号(TERRA星环安全团队):【Python编程】ThreadPoolExecutor 全面指北(1)什么是线程池
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论