Heim > Artikel > Backend-Entwicklung > Was ist ein verteilter Python-Prozess? (Beispielanalyse)
In diesem Artikel werfen wir einen Blick darauf, was ein Python-verteilter Prozess ist. Erfahren Sie mehr über verteilte Python-Prozesse und welche Rolle verteilte Prozesse bei der Python-Programmierung spielen können.
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 auf 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. Ein Dienstprozess kann als Planer fungieren und Aufgaben auf mehrere andere Prozesse verteilen, wobei er sich auf die Netzwerkkommunikation verlässt. Da das Manager-Modul gut gekapselt ist, können Sie problemlos verteilte Multiprozessprogramme schreiben, ohne die Details der Netzwerkkommunikation zu kennen.
Zum Beispiel: Wenn wir bereits ein Programm mit mehreren Prozessen haben, das über die Warteschlange kommuniziert und auf demselben Computer ausgeführt wird, möchten wir nun den Prozess, der sendet, trennen, da der Prozess, der die Aufgabe verarbeitet, eine hohe Arbeitslast hat die Aufgabe und der Prozess, der die Aufgabe erledigt. Auf zwei Maschinen verteilt. Wie implementiert man es mithilfe eines verteilten Prozesses?
Die ursprüngliche Warteschlange kann weiterhin verwendet werden, aber durch die Offenlegung der Warteschlange über das Netzwerk durch das Manager-Modul können Prozesse auf anderen Maschinen auf die Warteschlange zugreifen.
Sehen wir uns zunächst den Serviceprozess an. Der Serviceprozess ist dafür verantwortlich, die Warteschlange zu starten, die Warteschlange im Netzwerk zu registrieren und dann Aufgaben in die Warteschlange zu schreiben:
# task_master.py import random, time, queue from multiprocessing.managers import BaseManager # 发送任务的队列: task_queue = queue.Queue() # 接收结果的队列: result_queue = queue.Queue() # 从BaseManager继承的QueueManager: class QueueManager(BaseManager): pass # 把两个Queue都注册到网络上, callable参数关联了Queue对象: QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue) # 绑定端口5000, 设置验证码'abc': manager = QueueManager(address=('', 5000), authkey=b'abc') # 启动Queue: manager.start() # 获得通过网络访问的Queue对象: task = manager.get_task_queue() result = manager.get_result_queue() # 放几个任务进去: for i in range(10): n = random.randint(0, 10000) print('Put task %d...' % n) task.put(n) # 从result队列读取结果: print('Try get results...') for i in range(10): r = result.get(timeout=10) print('Result: %s' % r) # 关闭: manager.shutdown()
Bitte beachten Sie, wann Wenn wir ein Multiprozessprogramm schreiben, kann die erstellte Warteschlange direkt verwendet werden. In einer verteilten Multiprozessumgebung kann das Hinzufügen von Aufgaben zur Warteschlange jedoch nicht direkt auf die ursprüngliche Task_Queue angewendet werden QueueManager und muss übergeben werden. Die von manager.get_task_queue() erhaltene Queue-Schnittstelle wird hinzugefügt.
Dann starten Sie den Aufgabenprozess auf einem anderen Computer (er kann auch auf diesem Computer gestartet werden):
# task_master.py import random, time, queue from multiprocessing.managers import BaseManager # 发送任务的队列: task_queue = queue.Queue() # 接收结果的队列: result_queue = queue.Queue() # 从BaseManager继承的QueueManager: class QueueManager(BaseManager): pass # 把两个Queue都注册到网络上, callable参数关联了Queue对象: QueueManager.register('get_task_queue', callable=lambda: task_queue) QueueManager.register('get_result_queue', callable=lambda: result_queue) # 绑定端口5000, 设置验证码'abc': manager = QueueManager(address=('', 5000), authkey=b'abc') # 启动Queue: manager.start() # 获得通过网络访问的Queue对象: task = manager.get_task_queue() result = manager.get_result_queue() # 放几个任务进去: for i in range(10): n = random.randint(0, 10000) print('Put task %d...' % n) task.put(n) # 从result队列读取结果: print('Try get results...') for i in range(10): r = result.get(timeout=10) print('Result: %s' % r) # 关闭: manager.shutdown()
Der Aufgabenprozess muss über das Netzwerk, also die IP, mit dem Dienstprozess verbunden sein des Serviceprozesses muss angegeben werden.
Jetzt können Sie den Arbeitseffekt des verteilten Prozesses ausprobieren. Starten Sie zunächst den Dienstprozess task_master.py:
$ python3 task_master.py Put task 3411... Put task 1605... Put task 1398... Put task 4729... Put task 5300... Put task 7471... Put task 68... Put task 4219... Put task 339... Put task 7866... Try get results...
Nachdem der Prozess task_master.py die Aufgabe gesendet hat, beginnt er, auf die Ergebnisse der Ergebniswarteschlange zu warten. Starten Sie nun den Prozess task_worker.py:
$ python3 task_worker.pyConnect to server 127.0.0.1... run task 3411 * 3411... run task 1605 * 1605... run task 1398 * 1398... run task 4729 * 4729... run task 5300 * 5300... run task 7471 * 7471... run task 68 * 68... run task 4219 * 4219... run task 339 * 339... run task 7866 * 7866... worker exit.
Der Prozess task_worker.py endet und die Ergebnisse werden weiterhin im Prozess task_master.py gedruckt:
Result: 3411 * 3411 = 11634921 Result: 1605 * 1605 = 2576025 Result: 1398 * 1398 = 1954404 Result: 4729 * 4729 = 22363441 Result: 5300 * 5300 = 28090000 Result: 7471 * 7471 = 55815841 Result: 68 * 68 = 4624 Result: 4219 * 4219 = 17799961 Result: 339 * 339 = 114921 Result: 7866 * 7866 = 61873956
Was nützt das? einfaches Master/Worker-Modell? Tatsächlich handelt es sich um ein einfaches, aber echtes verteiltes Rechnen. Durch leichtes Modifizieren des Codes und Starten mehrerer Worker können die Aufgaben auf mehrere oder sogar Dutzende von Maschinen verteilt werden. Beispielsweise kann der Code zur Berechnung von n*n durch Senden ersetzt werden E-Mails, wodurch das asynchrone Senden von E-Mail-Warteschlangen realisiert wird.
Der Grund, warum auf die Warteschlange über das Netzwerk zugegriffen werden kann, ist QueueManager. Da QueueManager mehr als eine Warteschlange verwaltet, muss der Netzwerkaufrufschnittstelle jeder Warteschlange ein Name zugewiesen werden, z. B. get_task_queue.
Was nützt Authkey? Dadurch soll sichergestellt werden, dass die beiden Maschinen normal kommunizieren und nicht von anderen Maschinen böswillig gestört werden. Wenn der Authentifizierungsschlüssel von task_worker.py nicht mit dem Authentifizierungsschlüssel von task_master.py übereinstimmt, schlägt die Verbindung definitiv fehl.
Pythons verteilte Prozessschnittstelle ist einfach und gut gekapselt, sodass sie für Umgebungen geeignet ist, in denen schwere Aufgaben auf mehrere Maschinen verteilt werden müssen.
Beachten Sie, dass die Aufgabe der Warteschlange darin besteht, Aufgaben zu liefern und Ergebnisse zu erhalten. Die Datenmenge, die jede Aufgabe beschreibt, sollte so gering wie möglich sein. Wenn Sie beispielsweise eine Aufgabe zum Verarbeiten einer Protokolldatei senden, senden Sie nicht die Protokolldatei selbst, die mehrere hundert Megabyte groß ist, sondern den vollständigen Pfad, in dem die Protokolldatei gespeichert ist, und der Worker-Prozess liest die Datei dann die freigegebene Festplatte.
Das Obige ist der gesamte in diesem Artikel beschriebene Inhalt. In diesem Artikel werden hauptsächlich die relevanten Kenntnisse über den Python-verteilten Prozess vorgestellt. Ich hoffe, dass das, was ich in diesem Artikel beschrieben habe, für Sie hilfreich ist und Ihnen das Erlernen von Python erleichtert.
Weitere Informationen zu diesem Thema finden Sie in der Spalte Python-Tutorial auf der chinesischen PHP-Website.
Das obige ist der detaillierte Inhalt vonWas ist ein verteilter Python-Prozess? (Beispielanalyse). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!