Heim > Artikel > Backend-Entwicklung > Ein Artikel, der Ihnen hilft, die verteilte Prozessschnittstelle von Python zu verstehen
1. Einführung
Unter Thread und Process sollte Process bevorzugt werden, da Process stabiler ist und Process auf mehrere Maschinen verteilt werden kann, während Thread höchstens auf mehrere CPUs derselben Maschine verteilt werden kann .
Das Multiprocessing-Modul von Python unterstützt nicht nur mehrere Prozesse, sondern das Manager-Submodul unterstützt auch die Verteilung mehrerer Prozesse auf mehrere Maschinen. Sie können einen Dienstprozess als Planer schreiben, um Aufgaben auf mehrere andere Prozesse zu verteilen und sich für die Verwaltung auf die Netzwerkkommunikation zu verlassen.
2. Fallanalyse
Wenn Sie ein Crawler-Programm erstellen, erfassen Sie alle Bilder einer Website. Wenn Sie mehrere Prozesse verwenden, ist normalerweise ein Prozess dafür verantwortlich, die Linkadresse des Bildes zu erfassen und die Linkadresse einzufügen In der Warteschlange ist ein anderer Prozess dafür verantwortlich, die Linkadresse aus der Warteschlange abzurufen, herunterzuladen und lokal zu speichern.
Wie implementiert man es mithilfe eines verteilten Prozesses?
Der Prozess auf einem Computer ist für das Erfassen der Linkadresse verantwortlich, und die Prozesse auf anderen Computern sind für deren Speicherung verantwortlich. Das Hauptproblem besteht darin, die Warteschlange dem Netzwerk zugänglich zu machen, damit andere Maschinenprozesse darauf zugreifen können. Dieser Prozess kann als Vernetzung lokaler Warteschlangen bezeichnet werden.
Beispiel:
1.py
from multiprocessing.managers import BaseManager from multiprocessing import freeze_support, Queue # 任务个数 task_number = 10 # 收发队列 task_quue = Queue(task_number) result_queue = Queue(task_number) def get_task(): return task_quue def get_result(): return result_queue # 创建类似的queueManager class QueueManager(BaseManager): pass def win_run(): # 注册在网络上,callable 关联了Queue 对象 # 将Queue对象在网络中暴露 # window下绑定调用接口不能直接使用lambda,所以只能先定义函数再绑定 QueueManager.register('get_task_queue', callable=get_task) QueueManager.register('get_result_queue', callable=get_result) # 绑定端口和设置验证口令 manager = QueueManager(address=('127.0.0.1', 8001), authkey='qiye'.encode()) # 启动管理,监听信息通道 manager.start() try: # 通过网络获取任务队列和结果队列 task = manager.get_task_queue() result = manager.get_result_queue() # 添加任务 for url in ["ImageUrl_" + str(i) for i in range(10)]: print('url is %s' % url) task.put(url) print('try get result') for i in range(10): print('result is %s' % result.get(timeout=10)) except: print('Manager error') finally: manager.shutdown() if __name__ == '__main__': freeze_support() win_run()
Der Port und das Bestätigungskennwort sollten genau die gleichen sein wie im Serverprozess. Rufen Sie die Warteschlange vom Netzwerk ab, führen Sie die Aufgabe aus aus der Aufgabenwarteschlange und schreiben Sie das Ergebnis in die Ergebniswarteschlange
2.py
#coding:utf-8 import time from multiprocessing.managers import BaseManager # 创建类似的Manager: class Manager(BaseManager): pass #使用QueueManager注册获取Queue的方法名称 Manager.register('get_task_queue') Manager.register('get_result_queue') #连接到服务器: server_addr = '127.0.0.1' print('Connect to server %s...' % server_addr) # 端口和验证口令注意保持与服务进程设置的完全一致: m = Manager(address=(server_addr, 8001), authkey='qiye') # 从网络连接: m.connect() #获取Queue的对象: task = m.get_task_queue() result = m.get_result_queue() #从task队列取任务,并把结果写入result队列: while(not task.empty()): image_url = task.get(True,timeout=5) print('run task download %s...' % image_url) time.sleep(1) result.put('%s--->success'%image_url) #结束: print('worker exit.')
Der Aufgabenprozess muss über das Netzwerk eine Verbindung zum Dienstprozess herstellen, daher muss die IP des Dienstprozesses angegeben werden.
Die laufenden Ergebnisse sind wie folgt:
Erhalten Sie die Bildadresse und übergeben Sie die Adresse an 2.py.
Empfangen Sie die von 1.py übergebene Adresse, laden Sie das Bild herunter und die Konsole zeigt die Crawling-Ergebnisse an.
3. Zusammenfassung
Die verteilte Prozessschnittstelle von Python ist einfach und gut gekapselt. Sie eignet sich für Umgebungen, in denen schwere Aufgaben auf mehrere Maschinen verteilt werden müssen . Indem erklärt wird, dass die Rolle der Warteschlange darin besteht, Aufgaben zu liefern und Ergebnisse zu erhalten.
Das obige ist der detaillierte Inhalt vonEin Artikel, der Ihnen hilft, die verteilte Prozessschnittstelle von Python zu verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!