当梦想照进现实

Python多线程简易版 - 线程池threadpool

2013.10.30

桂正和I'S漫画美女
好久没分享技术类文章了,一方面是感觉自己技术差,另一方面是最近静不下心去研究,总是不求甚解,半途而废。
近来也写了几个小程序,比如查询收录,查询排名,python已逐渐成为不可或缺的打杂利器。但速度问题一直是心头之恨,写的程序都是一根筋,在《Python核心编程》的多线程一章看了两遍,也一直不理解多线程怎么用,怎么构建线程池,控制线程数量。后来无意间发现了个多线程简易版,可以控制线程数量,4行代码实现线程池,正好符合我这小白的需求。

使用

以下是简单的4行代码:

pool = threadpool.ThreadPool(10)  #建立线程池,控制线程数量为10
reqs = threadpool.makeRequests(get_title, data, print_result)  #构建请求,get_title为要运行的函数,data为要多线程执行函数的参数,最后这个print_result是可选的,是对前两个函数运行结果的操作
[pool.putRequest(req) for req in reqs]  #多线程一块执行
pool.wait()  #线程挂起,直到结束

示例

只要以上4行代码就可以实现多线程,能控制线程数量,吊不吊?!下面是我写的一个小程序,就记录下时间。

import threadpool
import time


def now_time(n):
  print 'Starting at %s' % time.ctime()
  time.sleep(n)
  print 'Ending at %s' % time.ctime()

pool = threadpool.ThreadPool(5)
reqs = threadpool.makeRequests(now_time, range(1, 11))
[pool.putRequest(req) for req in reqs]
pool.wait()

当然,也可以对结果进行操作,下面是调整后版本:

import threadpool
import time


def now_time(n):
  print 'Starting at %s' % time.ctime()
  time.sleep(n)
  return 'Ending at %s' % time.ctime()


def print_now(request, n):
  print '%s - %s' % (request.requestID, n)  #这里的requestID只是显示下,没实际意义

pool = threadpool.ThreadPool(5)
reqs = threadpool.makeRequests(now_time, range(1, 11), print_now)
[pool.putRequest(req) for req in reqs]
pool.wait()

对于更多的API和使用方法,请访问threadpool的官方网站(http://chrisarndt.de/projects/threadpool/api/),或者pypi页面(https://pypi.python.org/pypi/threadpool#downloads),再或者看google code源码(https://code.google.com/p/pythonthreadpool/)。

安装

我是使用easy install安装的,很方便,建议您也考虑这个方法。可以自动匹配版本并安装。
或者上pypi上(https://pypi.python.org/pypi/threadpool#downloads)下载文件安装。
不过从官网来看,好像闲置了很久,从09年开始就没更新了。

最后

我将threadpool用于查询收录,查询排名等独立运行,没有占用共同资源的脚本,虽说没有threading操作精确,但确实很简单。
图记:好吧,之前的图片太丑了,就换成了桂正和的漫画《I'S》中的女主人公,还记得高中时候一群男生都抢着看这套漫画,里面的主人公太漂亮了。

Comments
Write a Comment