python3多线程-线程池和优先队列
1、介绍
有两种线程池方案。
各线程持续存在,从任务池获取任务进行执行
按照需求创建线程,每个线程只执行一个任务,结束完毕则该线程结束
2、准备
(1)任务池task_list
任务池是用于准备各任务单元的环境,比如http爆破时的请求参数,读写文件时的路径。
任务池的准备可能会占用一定时间,边准备边使用为好
任务池可能会占用较大内存空间,因此最好的是边使用边销毁
(2)线程池thread_list
线程池是用于存放线程对象。但并不一定是list形式,在不涉及调用创建的线程时,也可以是一个变量记录当前的线程数的变量,比如thread_count
(3)最大线程数thread_max_count
表示在同时间,允许的最大线程数
3、线程多任务方案
(1)根据thread_max_count,创建多个线程。每个线程任务,会监控任务池task_list的情况,当存在需要处理的任务时,进行读取和处理
(2)如果任务池task_list占用内存太大,或者完全初始化任务池需要太长时间,或者由于需要关联背景无法直接初始化任务池。则需要一个task_thread线程来生成任务池需要的任务,同时线程池进行消耗处理任务池
4、线程单任务方案
(1)主线程创建任务,如果当前线程数thread_count小于最大线程数thread_max_count,则创建线程来处理该任务。否则,休眠等待已有的线程结束再创建
5、优先队列
Python 的 Queue 模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。