在python中,线程池一般通过threading和Queue来实现。这里只是说明一些原理。
原来学校旁边有个诊所,平时医生忙里忙外,一个人还能基本完成诊断工作。
这就是一般的单线程了。有十个人看病,你也只能等你前面的九个人看好了才轮到你。
某一天,出现了流感,诊所门口爆满!医生一个人实在忙不过来了。只好在诊所外面搭了九顶帐篷,添加了九位实习医生,用于分散人流,加快就诊速度。
现在结构就很清晰了:
有1000个页面要抓取,现在创建了十个线程。这1000个页面不是平均分配的。这里采用的是多劳多得,少劳少得。
这里有一个很简单的例子:
import threading
import Queue
queue = Queue.Queue()
class Worker(threading.Thread):
def __init__(self, queue):
threading.Thread.__init__(self)
self.queue = queue
self.start()
def run(self):
while True:
if self.queue.empty():
break;
caller, args = self.queue.get()
caller(args)
self.queue.task_done()
def do_somethinking(arg):
pass
'''
here are 1000 pages need to analyze
'''
def fetch():
for i in xrange(1000):
queue.put((do_something, arg))
### main ###
if __name__ == '__main__':
# maybe some data
fetch()
#create the worker threads
for i in xrange(10):
Worker(queue)
这里的Worker就是对应的医生,而这里的fetch就是病毒,专门然人感冒,不然就不会有人去看医生了。
不管你生不生病,医生就在那里。
但是Python的多线程是有争议的,效果并不能像C/C++这些语言那样。要利用多和CPU的优势,多用multiprocessing模块。
关于multiprocessing的讲解随后奉上。