最近使用使用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。正確的選擇線程還進程執行,才能真正的提高效率。