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

http://blog.sina.com.cn/s/blog_631d3a630101jxj2.html

好久没分享技术类文章了,一方面是感觉自己技术差,另一方面是最近静不下心去研究,总是不求甚解,半途而废。
近来也写了几个小程序,比如查询收录,查询排名,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() defprint_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》中的女主人公,还记得高中时候一群男生都抢着看这套漫画,里面的主人公太漂亮了。

你可能感兴趣的:(Python多线程简易版 - 线程池threadpool)