Python多程式抓取全國郵政編碼和長途區號

青衫無名發表於2018-03-14

由於Python設計的限制(就是我們們常用的CPython)最多隻能用滿1個CPU核心。Python提供了非常好用的多程式包multiprocessing,你只需要定義一個函式,Python會替你完成其他所有事情。藉助這個包,可以輕鬆完成從單程式到併發執行的轉換。使用程式池可以讓你跑滿多核CPU,而且使用方法非常簡單。

Show You The Code:

import multiprocessing
import time
def func(msg):
 for i in xrange(3):
 print msg
 time.sleep(1)
 return "done " + msg
if __name__ == "__main__":
 pool = multiprocessing.Pool(processes=4)
 result = []
 for i in xrange(10):
 msg = "hello %d" %(i)
 result.append(pool.apply_async(func, (msg, )))
 pool.close()
 pool.join()
 for res in result:
 print res.get()
 print "Sub-process(es) done."

processes=4是最多併發程式數量,使用Pool,還需要關注每個程式的執行結果。下面以多程式抓取全國郵政編碼和長途區號為例。目標站點:http://www.ip138.com

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

使用以下語句匯入多執行緒模組:

from multiprocessing.dummy import Pool as ThreadPool
640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

multiprocessing包是Python中的多程式管理包,這個模組表示像執行緒一樣管理程式,這個是multiprocessing的核心,它與threading很相似,對多核CPU的利用率會比threading好的多。Pool類可以提供指定數量的程式供使用者呼叫,當有新的請求提交到Pool中時,如果池還沒有滿,就會建立一個新的程式來執行請求。如果池滿,請求就會告知先等待,直到池中有程式結束,才會建立新的程式來執行這些請求。

Pool類中的map方法,與內建的map函式用法行為基本一致,它會使程式阻塞直到返回結果。雖然第二個引數是一個迭代器,但在實際使用中,必須在整個佇列都就緒後,程式才會執行子程式。map函式用法如下:

map(func, iterable[, chunksize=None])

獲取文字內容:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

對郵政編碼進行解析:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

獲取全國郵編結果如下:640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

原文釋出時間為:2016-10-28本文來自雲棲社群合作伙伴“Python中文社群”,瞭解相關資訊可以關注“Python中文社群”微信公眾號


相關文章