Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Einführung in verteilte Prozesse in Python (mit Beispielen)

Detaillierte Einführung in verteilte Prozesse in Python (mit Beispielen)

不言
不言Original
2018-09-20 17:18:343099Durchsuche

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.

Detaillierte Einführung in verteilte Prozesse in Python (mit Beispielen)

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

Detaillierte Einführung in verteilte Prozesse in Python (mit Beispielen)

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn