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

DDD
Freigeben: 2024-10-19 18:47:02
Original
787 Leute haben es durchsucht

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))
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!