当前位置: 首页 > 图灵资讯 > 行业资讯> 进一步认识python线程池

进一步认识python线程池

发布时间:2025-09-22 10:56:00

线程池的概念是什么?

在面向对象的编程中,创建和销毁对象需要很多时间,因为创建一个对象需要获得内存资源或更多其他资源。在Java中 这样,虚拟机就会试图跟踪每个物体,以便在物体被销毁后回收垃圾。因此,提高服务程序效率的一种方法是尽可能减少创建和销毁对象的次数,特别是一些 创建和销毁消耗大量资源的对象。如何利用现有对象服务是一个需要解决的关键问题。事实上,这是一些"池化资源"产生技术的原因。

我理解线程池是一个存储多个线程的单元,也有相应的任务队列。整个执行过程实际上是使用线程池中有限的线程来执行任务 完成队列中的任务。这样做的好处是你不需要为每个任务创建一个线程,因为当你创建第100个线程来执行第100个任务时,前面可能有50条线 工作结束了。因此,重复使用线程来执行任务,减少系统资源的开支。

一个不恰当的比喻是,有100台电脑主机箱需要从一楼搬到二楼。你不需要打电话给100人帮忙搬家。你只需要打电话给10或20个人。每个人分配10或5个,甚至谁搬得快,谁就知道如何完成未知。(这个比喻似乎是。。。)

无论如何,一般理解线程池的概念。那么python是如何实现的呢?

代码如下

#!/usr/bin/envpython
#-*-coding:utf-8-*-
#ref_blog:http://www.open-open.com/home/space-5679-do-blog-id-3247.html
importQueue
importthreading
importtime
classWorkManager(object):
def__init__(self,work_num=1000,thread_num=2):
self.work_queue=Queue.Queue()
self.threads=[]
self.__init_work_queue(work_num)
self.__init_thread_pool(thread_num)
"""
初始化线程
"""
def__init_thread_pool(self,thread_num):
foriinrange(thread_num):
self.threads.append(Work(self.work_queue))
"""
初始化工作队列
"""
def__init_work_queue(self,jobs_num):
foriinrange(jobs_num):
self.add_job(do_job,i)
"""
加一份工作入队
"""
defadd_job(self,func,*args):
self.work_queue.put((func,list(args)))#任务入队,Queueue内部实现了同步机制
"""
检查剩余的队列任务
"""
defcheck_queue(self):
returnself.work_queue.qsize()
"""
等待所有线程运行完成
"""
defwait_allcomplete(self):
foriteminself.threads:
ifitem.isAlive():item.join()
classWork(threading.Thread):
def__init__(self,work_queue):
threading.Thread.__init__(self)
self.work_queue=work_queue
self.start()
defrun(self):
#死循环使创建的线程在一定条件下关闭并退出
whileTrue:
try:
do,args=self.work_queue.get(block=False)#任务异步出队,Queueue内部实现了同步机制
do(args)
self.work_queue.task_done()#完成通知系统的任务
exceptException,e:
printstr(e)
break
#具体要做的任务
defdo_job(args):
printargs
time.sleep(0.1)#模拟处理时间
printthreading.current_thread(),list(args)
if__name__='__main__':
start=time.time()
work_manager=WorkManager(10,2)#或work_manager=WorkManager(10000,20)
work_manager.wait_allcomplete()
end=time.time()
print"costalltime:%s"%(end-start)

这个代码清晰易懂。

整个代码只有两类:WorkManager和Work,如命名所示,前者是管理者,管理线程池和任务队列,而后者是具体的线程。

它的整个操作逻辑是将制定的任务量和线程数分配给WorkManager,然后从任务队列中获取每个线程执行任务,直到队列中没有任务。Queue内部的同步机制也用在这里(至于目前还没有研究什么同步机制)。

总结一下这样一个线程池的作用,对于我最初的目的来说,这是永远不会发生的,因为我需要在web页面上控制线程的启动和停止,而这个线程池似乎只是用来并发任务的。然而,我认为虽然它在控制线程方面没有效果,但它的并发执行任务仍然很好,可能可以用于爬网页部分。

相关文章

Python中reduce函数和lambda表达式的学习

Python中reduce函数和lambda表达式的学习

2025-09-25
Python小白必学的面向对象

Python小白必学的面向对象

2025-09-25
一个例子解释python装饰器

一个例子解释python装饰器

2025-09-25
深入理解Python的set和dict

深入理解Python的set和dict

2025-09-25
Python中正则表达式的巧妙使用

Python中正则表达式的巧妙使用

2025-09-25
5分钟搞定Python中函数的参数

5分钟搞定Python中函数的参数

2025-09-25