python线程池和进程池,python多线程池
线程池的概念是什么?
在面向对象编程中,创建和销毁对象需要花费大量时间,因为创建一个对象需要获取内存资源或其他更多资源。特别是在Java中,虚拟机会试图跟踪每一个对象,这样就可以在对象被破坏后进行垃圾收集。因此,提高服务程序效率的一个方法是尽可能减少对象的创建和销毁次数,尤其是一些消耗资源的对象的创建和销毁。如何利用已有的对象来服务是一个需要解决的关键问题。事实上,这就是一些“资源池”技术产生的原因。
我理解的线程池是一个存储很多线程的单元,也有相应的任务队列。整个执行过程实际上就是利用线程池中有限的线程来完成任务队列中的任务。这样做的好处是,你不需要为每个任务都创建一个线程,因为当你创建第100个线程来执行第100个任务的时候,你前面可能已经有50个线程了。因此,线程被重用来执行任务,这减少了系统资源的开销。
一个不恰当的比喻是,有100个主机箱需要从一楼搬到二楼。你不需要叫100个人来帮你搬。你只需要给十几二十个人打电话。每个人被分配十个或五个,甚至谁移动得快谁移动得多,直到完成是未知的。(这个比喻好像是。)
反正线程池的概念一般都懂。那么如何用python实现呢?
代码如下所示
#!/usr/bin/envpython
#-*-编码:utf-8-*-
# ref _ blog :http://www . open-open.com/home/space-5679-do-blog-id-3247 . html
导入队列
导入线程
进口时间
classWorkManager(对象):
def__init__(self,work_num=1000,thread_num=2):
self.work_queue=Queue。队列()
self.threads=[]
自我。_ _初始化工作队列(工作编号)
自我。_ _初始化线程池(线程数量)
初始化线程
def__init_thread_pool(self,thread_num):
foriinrange(线程数量):
self . threads . append(Work(self . Work _ queue))
初始化工作队列
def__init_work_queue(self,jobs_num):
foriinrange(作业编号):
self.add_job(do_job,I)
给团队增加一个工作。
铌
sp;"""
defadd_job(self,func,*args):
self.work_queue.put((func,list(args)))#任务入队,Queue内部实现了同步机制
"""
检查剩余队列任务
"""
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)#任务异步出队,Queue内部实现了同步机制
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页面来控制线程的启动和停止,而这个线程池看起来只是用来并发完任务的。不过我想虽然在控制线程方面没有作用,但是它的并发执行任务的作用还是蛮不错,或许可以用在爬网页的部分。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。