用Python创建线程池
December 23rd, 2008 | by 超群.com | 知识共享署名-非商业性使用-相同方式共享,转载请保留链接。本博客所有原创文章采用知识共享署名-非商业性使用-相同方式共享,转载请保留链接http://chaoqun.17348.com/2008/12/python-thread-pool/
最近在做一些数据挖掘方面的工作,需要对海量的数据进行处理,在目前的硬件环境下,多进程+多线程的方式对运算时间的减少大有裨益,我用的是Python语言,开发效率高,运算效率也不低。
Python里面成型的线程池可以看以下http://www.chrisarndt.de/projects/threadpool/,看了一下API介绍,应该写的比较完备了,我这里想介绍的是Python线程池实现的原理以及一个简明的线程池代码实例。
我这里是用Queue这个包来实现的,Queue翻译成中文就是队列,全局的,我们把任务放进队列中去,然后开N个线程,每个线程都去队列中取一个任务,执行完了之后告诉系统说我执行完了,然后接着去队列中取下一个任务,直至队列中所有任务取空,退出线程。
这就是一般的线程池实现的原理,下面看一个实际的代码:
import time import threading import Queueclass Worker(threading.Thread): def __init__(self, name, queue): threading.Thread.__init__(self) self.queue = queue self.start()def run(self): # 著名的死循环,保证接着跑下一个任务 while True: # 队列为空则退出线程 if self.queue.empty(): break# 获取一个项目 foo = self.queue.get()# 延时1S模拟你要做的事情 time.sleep(1)# 打印 print self.getName(),':', foo# 告诉系统说任务完成 self.queue.task_done()# 队列 queue = Queue.Queue()# 加入100个任务队列 for i in range(100): queue.put(i)# 开10个线程 for i in range(10): threadName = 'Thread' + str(i) Worker(threadName, queue)# 所有线程执行完毕后关闭 queue.join()
那些成型的代码都非常的复杂,想了解实现原理难度颇大,希望这篇短文能起到拨开云雾的功用。
Tags: Python, thread pool