Python实现简单的线程池

线程池是什么呢

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。

以上摘自IBM文档库

参考网上写了一些代码实现,基本原则是,定义一个Worker去干活,然后用一个WorkerManager来管理这些Worker,只要Worker列表有Worker在等待,就去检查任务列表是否有任务。如果有任务,则派出这一Worker线程执行任务,执行完毕,再将Worker压回Worker列表

代码实现

from threading import Thread
import time
import sys
#每个worker都是Thread的一个子类
class Worker(Thread):
    worker_count = 0
    #worker知道将任务列表中的任务取出并将结果放入结果列表
    def __init__( self, workQueue, resultQueue, **kwds):
        Thread.__init__( self, **kwds )
        self.id = Worker.worker_count
        Worker.worker_count += 1
        self.setDaemon( True )
        self.workQueue = workQueue
        self.resultQueue = resultQueue
        self.start( )

    #到任务列表中找到任务并执行
    def run( self ):
        while True:
            try:
                callable, args, kwds = self.workQueue.pop(timeout=Worker.timeout)
                res = callable(*args, **kwds)
                self.resultQueue.push( res )
            except Queue.isEmpty():
                break
            except :
                print 'worker[%2d]' % self.id, sys.exc_info()[:2]
                raise

class ThreadPool(object):
    def __init__(self, work_num = 10):
        self.workQueue = Queue()
        self.resultQueue = Queue()
        self.workers = []
        for i in range(work_num):
            worker = Worker( self.workQueue, self.resultQueue )
            self.workers.append(worker)

    #取出Worker,另其工作,工作结束后重回Worker列表
    def wait_for_complete(self):
        while len(self.workers):
            worker = self.workers.pop()
            worker.join( )
            if worker.isAlive() and not self.workQueue.empty():
                self.workers.append( worker )

    #任务列表中的任务都是可执行函数
    def add_job( self, callable, *args, **kwds ):
        self.workQueue.push( (callable, args, kwds) )

    def get_result(self):
        return self.resultQueue

参考

[1] 我对python线程池的理解
[2] the5fire的技术博客
[3] 老韩,在文字和技术间游走
[4] Threadpool