就比如我們需要抓取某個圖片網站的所有圖片,如果用我們的分布式進程的思想,我們會創(chuàng)建一個進程負責抓取圖片的鏈接地址,然后將這些鏈接地址存放到Queue中,另外的進程負責從Queue中讀取鏈接進行圖片的下載或者進行其他操作(存在本地)
其實我們的Queue是暴露在網絡中的,通過分布式就是將其進行了封裝,其實也就是所謂的本地隊列的網絡化。
接下來,我們來分析一下如何去創(chuàng)建一個分布式的服務進程,總體可以分為六步:
1、首先我們需要建立一個隊列queue,這個主要用作進程之間的通信。總體來說就是兩種進程,一種是服務進程,一種是任務進程。服務進程創(chuàng)建任務隊列task_queue,用作傳遞任務給任務進程的通道。服務進程又創(chuàng)建result_queue,作為任務進程完成任務后回復服務進程的通道。在分布式進程的環(huán)境下,我們需要通過Queuemanager 獲得的Queue接口來添加任務。
2、把我們在第 一步中隊列在網絡上進行注冊,暴露給其他的進程或者主機,注冊后獲得網絡隊列,相當于本地隊列的映像。
3、建立Queuemanager的對象,并且實例化,綁定端口和口令
4、啟動第三步中建立的實例,即啟動管理manager,監(jiān)管信息通道
5、通過管理實例的方法獲取到通過網絡訪問的queue對象,也就是把網絡對象實體化成本地的一個隊列。
6、創(chuàng)建任務到“本地”隊列中,自動上傳任務到網絡隊列中,分配給任務進程進行處理。
我們來寫一下服務進程的代碼 taskManager.py:
import queue
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
# 任務個數
task_num = 500
# 定義收發(fā)隊列
task_queue = queue.Queue(task_num)
result_queue = queue.Queue(task_num)
def get_task():
return task_queue
def get_result():
return result_queue
# 創(chuàng)建類似的QueueManager
class QueueManager(BaseManager):
pass
def run():
# Windows下綁定調用接口不能使用lambda,所以只能先定義函數再綁定
QueueManager.register('get_task_queue', callable = get_task)
QueueManager.register('get_result_queue', callable=get_result)
#綁定端口并設置驗證口令,windows下需要填寫ip地址,Linux中不填默認為本地
manager = QueueManager(address=('127.0.0.1', 8001), authkey='jap'.encode('utf-8'))
# 啟動
manager.start()
try:
# 通過網絡獲取任務隊列和結果隊列
task = manager.get_task_queue()
result = manager.get_result_queue()
# 添加任務
for url in ["JAP君url:"+str(i) for i in range(500)]:
print("添加任務 %s" %url)
task.put(url)
print("正在獲取結果...")
for i in range(500):
print("result is %s" %result.get(timeout=10))
except:
print('Manager error')
finally:
# 一定要關閉,否則會報管道未關閉的錯
manager.shutdown()
if __name__ == '__main__':
# windows下多進程可能會出現問題,添加這句話可以解決
freeze_support()
run()
看到這里相信多多少少對分布式進程爬蟲也有了一些新的理解和感悟,本篇文章主要是針對于大家思路的打開,寫代碼只是驗證思路的一個實驗~
下一篇: 沒有了
初級會計職稱中級會計職稱經濟師注冊會計師證券從業(yè)銀行從業(yè)會計實操統(tǒng)計師審計師高級會計師基金從業(yè)資格稅務師資產評估師國際內審師ACCA/CAT價格鑒證師統(tǒng)計資格從業(yè)
一級建造師二級建造師消防工程師造價工程師土建職稱房地產經紀人公路檢測工程師建筑八大員注冊建筑師二級造價師監(jiān)理工程師咨詢工程師房地產估價師 城鄉(xiāng)規(guī)劃師結構工程師巖土工程師安全工程師設備監(jiān)理師環(huán)境影響評價土地登記代理公路造價師公路監(jiān)理師化工工程師暖通工程師給排水工程師計量工程師
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級職稱護士資格證初級護師主管護師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實踐技能內科主治醫(yī)師外科主治醫(yī)師中醫(yī)內科主治兒科主治醫(yī)師婦產科醫(yī)師西藥士/師中藥士/師臨床檢驗技師臨床醫(yī)學理論中醫(yī)理論