Heim >Backend-Entwicklung >Python-Tutorial >Detaillierte Einführung in verteilte Prozesse in Python (mit Beispielen)
Der Inhalt dieses Artikels befasst sich mit der Frage, was SAPI in PHP ist. Wie erreicht man es? (Bilder und Text), es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen.
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. 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.
Das Offenlegen der Warteschlange über das Netzwerk mithilfe des Manager-Moduls ermöglicht es Prozessen auf anderen Computern, auf die Warteschlange zuzugreifen. Schauen wir uns zunächst den Dienstprozess an. Der Dienstprozess ist dafür verantwortlich, die Warteschlange zu starten, die Warteschlange im Netzwerk zu registrieren und dann Aufgaben in die Warteschlange zu schreiben.
BaseManager: Bietet eine Möglichkeit, Daten zwischen verschiedenen Maschinenprozessen auszutauschen.
(重要的点: ip:port)rrree
Wenn Sie das Programm ausführen, warten Sie 10 Sekunden lang auf das Ausführungsergebnis Aufgabe wird das Ergebnis zurückgegeben und das Programm meldet einen Fehler.
Wenn wir ein Multiprozessprogramm auf einer Maschine schreiben, kann die erstellte Warteschlange jedoch direkt in einem verteilten Multiprozessprogramm verwendet werden In der Umgebung kann das Hinzufügen von Aufgaben zur Warteschlange nicht direkt mit der ursprünglichen task_queue ausgeführt werden, wodurch die Kapselung des QueueManagers umgangen wird. Sie muss über die von manager.get_task_queue() erhaltene Warteschlangenschnittstelle hinzugefügt werden.
# task_master.py import random from multiprocessing import freeze_support from queue import Queue from multiprocessing.managers import BaseManager # 1. 创建需要的队列 # task_queue:发送任务的队列 # coding=utf-8 import random,time from queue import Queue from multiprocessing.managers import BaseManager from multiprocessing import freeze_support task_queue = Queue() # 发送任务的队列: result_queue = Queue() # 接收结果的队列: class QueueManager(BaseManager): # 从BaseManager继承的QueueManager: pass # windows下运行 def return_task_queue(): global task_queue return task_queue # 返回发送任务队列 def return_result_queue (): global result_queue return result_queue # 返回接收结果队列 def test(): # 把两个Queue都注册到网络上, callable参数关联了Queue对象,它们用来进行进程间通信,交换对象 #QueueManager.register('get_task_queue', callable=lambda: task_queue) #QueueManager.register('get_result_queue', callable=lambda: result_queue) QueueManager.register('get_task_queue', callable=return_task_queue) QueueManager.register('get_result_queue', callable=return_result_queue) # 绑定端口4000, 设置验证码'sheenstar': #manager = QueueManager(address=('', 4000), authkey=b'sheenstar') # windows需要写ip地址 manager = QueueManager(address=('192.168.1.160', 4000), authkey=b'sheenstar') manager.start() # 启动Queue: # 获得通过网络访问的Queue对象: task = manager.get_task_queue() result = manager.get_result_queue() for i in range(13): # 放几个任务进去: n = random.randint(0, 10000) print('Put task %d...' % n) task.put(n) # 从result队列读取结果: print('Try get results...') for i in range(13): r = result.get(timeout=10) print('Result: %s' % r) # 关闭: manager.shutdown() print('master exit.') if __name__=='__main__': freeze_support() print('start!') test()
Verwenden Sie die Befehlszeile, um das Programm auszuführen. Die Ergebnisse sind intuitiver
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in verteilte Prozesse in Python (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!