栏目分类

热点资讯

你的位置:apM Coin中文网 > LEGION中文网 > python中的线程池threadpool

python中的线程池threadpool


发布日期:2025-01-04 11:47    点击次数:61


python线程池threadpool 今天在学习python进程与线程时,无意间发现了线程池threadpool模块 模块使用非常简单,前提是得需要熟悉线程池的工作原理。 我们知道系统处理任务时,需要为每个请求创建和销毁对象。当有大量并发任务需要处理时,再使用传统的多线程就会造成大量的资源创建销毁导致服务器效率的下降。 这时候,线程池就派上用场了。线程池技术为线程创建、销毁的开销问题和系统资源不足问题提供了很好的解决方案。 优点 (1)可以控制产生线程的数量。通过预先创建一定数量的工作线程并限制其数量,控制线程对象的内存消耗。 (2)降低系统开销和资源消耗。通过对多个请求重用线程,线程创建、销毁的开销被分摊到了多个请求上。另外通过限制线程数量,降低虚拟机在垃圾回收方面的开销。 (3)提高系统响应速度。线程事先已被创建,请求到达时可直接进行处理,消除了因线程创建所带来的延迟,另外多个线程可并发处理。 线程池的基本实现方法 (1)线程池管理器。创建并维护线程池,根据需要调整池的大小,并监控线程泄漏现象。 (2)工作线程。它是一个可以循环执行任务的线程,没有任务时处于 Wait 状态,新任务到达时可被唤醒。 (3)任务队列。它提供一种缓冲机制,用以临时存放待处理的任务,同时作为并发线程的 monitor 对象。 (4)任务接口。它是每个任务必须实现的接口,工作线程通过该接口调度任务的执行。 构建线程池管理器时,首先初始化任务队列(Queue),运行时通过调用添加任务的方法将任务添加到任务队列中。 之后创建并启动一定数量的工作线程,将这些线程保存在线程队列中。线程池管理器在运行时可根据需要增加或减少工作线程数量。 工作线程运行时首先锁定任务队列,以保证多线程对任务队列的正确并发访问,如队列中有待处理的任务,工作线程取走一个任务并释放对任务队列的锁定,以便其他线程实现对任务队列的访问和处理。 在获取任务之后工作线程调用任务接口完成对任务的处理。当任务队列为空时,工作线程加入到任务队列的等待线程列表中,此时工作线程处于 Wait 状态,几乎不占 CPU 资源。 一旦新的任务到达,通过调用任务列表对象的notify方法,从等待线程列表中唤醒一个工作线程以对任务进行处理。 通过这种协作模式,既节省了线程创建、销毁的开销,又保证了对任务的并发处理,提高了系统的响应速度。 简而言之: 就是把并发执行的任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程。只要池里有空闲的线程,任务就会分配给一个线程执行。 第一行的意思是创建一个可存放poolsize个数目的线程的线程池。第二行的意思是调用makeRequests创建请求。 some_callable是需要开启多线程处理的函数,list_of_args是函数参数,callback是可选参数回调,默认是无。第三行的意思是把运行多线程的函数放入线程池中。最后一行的意思是等待所有的线程完成工作后退出。 通过分析源代码,其实发现里面的内容很简单。 有三个类 ThreadPool,workRequest,workThread 第一步我们需要建立一个线程池调度ThreadPool实例(根据参数而产生多个线程works),然后再通过makeRequests创建具有多个不同参数的任务请求workRequest,然后把任务请求用putRequest放入线程池中的任务队列中,此时线程workThread就会得到任务callable,然后进行处理后得到结果,存入结果队列。如果存在callback就对结果调用函数。 注意:结果队列中的元素是元组(request,result)这样就一一对应了。 python线程池使用样例 以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。