最近使用使用Python做IP地理库查询,想着提高效率,按照IO密集型采用多线程,CPU密集型使用多进程,初步以为查询应该是IO密集型任务,所以初步我是采用的多线程,但是跑了一天后(跑千万量级)发现速度好慢啊,于是我就做了简单的测试,我是用的机器是8核32线程的配置,测试代码与运行时间如下:
- 采用4线程去执行,花费162秒
from multiprocessing.dummy import Pool as ThreadPool
import time
def main ():
start = time.time()
pool = ThreadPool(4)
#文件读取
pool.map(do_query, file_name)
pool.close()
pool.join()
end = time.time()
print "time:", end-start
- 采用单线程,却只用了118秒
pool = ThreadPool(1)
所以接下来采用多进程的测试,果然采用4进程,只用了30s.
from multiprocessing import Pool as ProcessPool
import time
def main ():
start = time.time()
pool = ProcessPool(4)
#文件读取
pool.map(do_query, file_name)
pool.close()
pool.join()
end = time.time()
print "time:", end-start
后来果断将脚本改为多进程运行,这是在使用Python的时候犯得一个错误,总觉得查询是IO密集型任务,但如果使用别人封装的接口,进行大批量任务之前最好是测试一下,到底是占IO还是CPU。正确的选择线程还进程执行,才能真正的提高效率。