Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann eine Warteschlange sicher zwischen Arbeitsprozessen im Multiprocessing-Modul von Python geteilt werden?

Wie kann eine Warteschlange sicher zwischen Arbeitsprozessen im Multiprocessing-Modul von Python geteilt werden?

DDD
DDDOriginal
2024-10-19 18:47:02785Durchsuche

How to Share a Queue Safely Between Worker Processes in Python's Multiprocessing Module?

Gemeinsame Nutzung einer Warteschlange durch mehrere Worker-Prozesse

Das Multiprocessing-Modul bietet Mechanismen zum Erstellen und Verwalten mehrerer Prozesse zur gleichzeitigen Ausführung von Aufgaben. Ein häufiger Anwendungsfall besteht darin, dass Arbeitsprozesse ihre Ergebnisse an einen zentralen Prozess zurückmelden. Hier kommen Warteschlangen ins Spiel. Wenn Sie jedoch apply_async verwenden, um Arbeitsprozesse zu erzeugen, kann die gemeinsame Nutzung einer Warteschlange zwischen ihnen eine Herausforderung sein.

Der Fehler: Objekte nur zur Vererbung in die Warteschlange stellen

Beim Versuch, a zu übergeben Wenn Sie die Warteschlange direkt an apply_async senden, kann ein RuntimeError auftreten: „Warteschlangenobjekte sollten nur durch Vererbung zwischen Prozessen geteilt werden.“ Dieser Fehler bedeutet, dass Warteschlangeninstanzen nur von Prozessen gemeinsam genutzt werden können, die durch Vererbung direkt miteinander verbunden sind. Im bereitgestellten Code wird der Arbeitsprozess nicht vom Hauptprozess geerbt, daher der Fehler.

Lösung: Verwendung von multiprocessing.Manager

Um diese Vererbungsbeschränkung zu überwinden, Multiprocessing stellt die Manager-Klasse bereit. Manager bietet eine Möglichkeit zum Erstellen von Objekten, die von mehreren Prozessen, einschließlich Warteschlangen, gemeinsam genutzt werden können. Durch die Verwendung von Manager können wir eine Warteschlange erstellen, auf die alle Arbeitsprozesse zugreifen können, ohne dass eine Vererbung erforderlich ist.

Überarbeiteter Code:

Der folgende Code zeigt, wie man teilt eine Warteschlange zwischen Arbeitsprozessen, die Multiprocessing verwenden.Manager:

import multiprocessing
def worker(name, que):
    que.put("%d is done" % name)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=3)
    m = multiprocessing.Manager()
    q = m.Queue()
    workers = pool.apply_async(worker, (33, q))

In diesem Code erstellt Manager() eine Managerinstanz m, die dann zum Instanziieren einer gemeinsam genutzten Warteschlange q verwendet wird. Die Warteschlange wird als Argument an die Methode apply_async übergeben, sodass die Arbeitsprozesse darauf zugreifen und Ergebnisse darin schreiben können. Dieser Ansatz ermöglicht die Kommunikation zwischen Arbeitsprozessen und dem Hauptprozess über die gemeinsame Warteschlange und eliminiert so die Möglichkeit von Vererbungsfehlern.

Das obige ist der detaillierte Inhalt vonWie kann eine Warteschlange sicher zwischen Arbeitsprozessen im Multiprocessing-Modul von Python geteilt werden?. 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