线程池的概念是什么?
在面向对象的编程中,创建和销毁对象非常耗时,因为创建对象需要获取内存资源或其他资源。在 Java 中更是如此,虚拟机将尝试跟踪每个对象,以便在对象被销毁后对其进行垃圾收集。因此,提高服务程序效率的一种方法是尽量减少创建和销毁对象的数量,尤其是一些资源非常密集的对象的创建和销毁。如何利用已有的对象来服务是一个需要解决的关键问题。事实上,这就是产生一些“资源汇集”技术的原因。
我理解线程池是一个存储很多线程的单元,也有对应的任务队列。整个执行过程其实就是利用线程池中有限的线程来完成任务队列中的任务。这样做的好处是你不需要为每个任务创建一个线程,因为当你创建第 100 个线程来执行第 100 个任务时,可能已经有 50 个线程完成了工作。因此,线程被复用来执行任务,减少了系统资源的开销。
一个不恰当的比喻是,有 100 个主机箱需要从 1 楼搬到 2 楼。你无需召集 100 个人来帮助你搬家。你只需要叫十个或二十个人,每个人分配十个。一五个甚至谁移动得更快,就会移动得更多,并且知道完成是未知的。 (这个比喻就像……)
反正,大致了解线程池的概念。那么如何在python中实现呢?
代码如下
# !/usr/bin/env python
# -*- coding:utf-8 -*-
# ref_blog:http://www.open-open.com/home/space-5679-do-blog-id-3247.html
import Queue
import threading
import time
class WorkManager(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):
for iin range(thread_num):
self.threads.append(Work(self.work_queue))
"""
初始化工作队列
"""
def __init_work_queue(self, jobs_num):
for iin range(jobs_num):
self.add_job(do_job, i)
"""
添加一项工作入队
"""
def add_job(self, func,*args):
self.work_queue.put((func,list(args)))#任务入队,Queue内部实现了同步机制
"""
检查剩余队列任务
"""
def check_queue(self):
return self.work_queue.qsize()
"""
等待所有线程运行完毕
"""
def wait_allcomplete(self):
for itemin self.threads:
if item.isAlive():item.join()
class Work(threading.Thread):
def __init__(self, work_queue):
threading.Thread.__init__(self)
self.work_queue= work_queue
self.start()
def run(self):
#死循环,从而让创建的线程在一定条件下关闭退出
while True:
try:
do, args= self.work_queue.get(block=False)#任务异步出队,Queue内部实现了同步机制
do(args)
self.work_queue.task_done()#通知系统任务完成
except Exception,e:
print str(e)
break
#具体要做的任务
def do_job(args):
print args
time.sleep(0.1)#模拟处理时间
print threading.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 "cost all time: %s" % (end-start)
这个代码清晰易懂。
整个代码中只有两个类:WorkManager 和 Work。前者确实是一个管理器,顾名思义,管理线程池和任务队列,而后者是一个特定的线程。
它的整个操作逻辑是将指定数量的任务和线程分配给WorkManager,然后每个线程从任务队列中获取任务执行,直到队列中没有任务为止。这里也用到了Queue内部的同步机制(至于同步机制,还没有研究过)。
总结一下这样一个线程池的作用,对于我的初衷来说,这个东西是永远不会on的,因为我需要在网页上控制线程的启动和停止,而这个线程池似乎只是用来完成任务的同时。但是我觉得它虽然对控制线程没有任何作用,但是它在并发执行任务方面的作用还是相当不错的,可能会用在爬取网页的部分。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何判断数据类型08/11
- ♥ 如何检查python是否安装10/06
- ♥ python类对象和实例对象是一样的11/02
- ♥ python3.5的print怎么不包裹输出?11/12
- ♥ python如何打开文件10/03
- ♥ 如何检查python是否安装成功09/30
内容反馈