Multiprocessing Queue maxsize-limit ist 32767
Ich versuche zu schreiben, ein Python 2.6 (OSX) Programm mit multiprocessing und ich wollen füllen Sie eine Warteschlange mit mehr als der Standardwert ist 32767 Elemente.
from multiprocessing import Queue
Queue(2**15) # raises OSError
Queue(32767)
funktioniert gut, aber jede höhere Zahl (z.B. Queue(32768)
) scheitert mit OSError: [Errno 22] Invalid argument
Gibt es eine Abhilfe für dieses Problem?
- huh? geben Sie den code bitte
- Welche Art von Daten in der Warteschlange enthalten? Sind Sie sicher, dass irgendeiner höheren Zahl scheitert, oder könnte es sein, dass die 32768th Daten-node, die den Fehler verursacht? (Verwenden Sie path-Namen zufällig?)
- Ich habe nicht aufgefüllt, die Warteschlange, bevor es explodiert. Nur die Einstellung max Größe bewirkt, dass die OSError.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein Ansatz wäre, um wickeln Sie Ihre
multiprocessing.Queue
mit einer benutzerdefinierten Klasse (nur auf der Hersteller Seite, oder transparent aus der Sicht des Verbrauchers). Mit, dass, würde man queue-Objekte versendet werden, um dieQueue
Objekt, das Sie Verpacken, und ernähren sich nur Dinge, die aus der lokalen Warteschlange (Pythonlist()
- Objekt) in dermultiprocess.Queue
als Raum zur Verfügung steht, mit exception handling zu drosseln, wenn dieQueue
voll ist.Ist wohl der einfachste Ansatz, da es sollten die minimalen Auswirkungen auf den rest von deinem code. Die individuelle Klasse sollte sich Verhalten wie eine Warteschlange beim verstecken der zugrunde liegenden
multiprocessing.Queue
hinter Ihrer Abstraktion.(Ein Ansatz könnte sein, die haben Ihre Produzenten verwenden Sie threads, ein thread zu verwalten den Versand von einer threading -
Queue
zu Ihremmultiprocessing.Queue
und anderen threads eigentlich nur die Fütterung der threadingQueue
)..qsize
- Methode löstNotImplementedError
mit der Erklärung "Wirft NotImplementedError auf Mac OSX wegen der gebrochenen sem_getvalue()". Ebenso die.full
Methode ist absolut unzuverlässig, auf OS X. und wenn ich mich nicht Irre gibt es keine zuverlässige Möglichkeit, die Informationen erhalten, die notwendig zur Implementierung der wrapper-Klasse, die Sie beschreiben....full
ist unzuverlässig, das ist es, was ich meinte: es scheint, wie es eine Verzögerung, bevor eineQueue
wird erkennen, dass es leer ist oder voll. Es tut werfen vernünftige Fehler (mutiprocessing.queues.Full
undmultiprocessing.queues.Empty
), aber zumindest dieEmpty
Ausnahme scheint das gleiche problem wie die.empty()
Methode. In meinen tests bisher, aber, ruftq.put(i,block=False)
scheint, um zuverlässig durch diemutiprocessing.queues.Full
Ausnahme, also eine wrapper-Klasse kann tatsächlich funktionieren...Habe ich bereits eine Antwort auf die ursprüngliche Frage, aber ich fühle mich wie das hinzufügen, dass Redis Listen sind sehr zuverlässig und das Python-Modul die Unterstützung für Sie sind extrem einfach zu bedienen, für die Implementierung einer Warteschlange wie Objekt. Diese haben den Vorteil, dass eine horizontale Skalierung über mehrere nodes (über ein Netzwerk), als auch nur über mehrere Prozesse.
Grundsätzlich, diese zu benutzen, würden Sie wählen Sie einfach einen Schlüssel (string) für die queue-Namen müssen Ihre Produzenten drängen in es und haben Ihre Mitarbeiter (Aufgabe, Verbraucher) - Schleife blockiert erscheint von dieser Taste.
Den Redis BLPOP, und BRPOP Befehle alle nehmen eine Liste von Schlüsseln (Listen/Warteschlangen) und einen optionalen timeout-Wert. Sie kehren ein Tupel (key,value) oder None (für die Wartezeit). So können Sie ganz einfach schreiben, ein event-basiertes system, das sehr ähnlich wie die gewohnte Struktur der wählen Sie() (aber auf einem viel höheren level). Die einzige Sache, die Sie haben zu beobachten, sind die fehlenden Schlüssel und ungültige Schlüssel-Typen (nur wickeln Sie Ihre queue-Operationen mit Ausnahme-Handler, natürlich). (Wenn eine andere Anwendung nicht auf Ihre freigegebenen Redis-server-entfernen von Schlüsseln oder Auswechseln von Schlüsseln, die Sie als Warteschlangen mit string/integer oder andere Werte ... gut, Sie haben ein anderes problem an dieser Stelle). 🙂
Ein weiterer Vorteil dieses Modells ist, dass Redis andauern, seine Daten auf die Festplatte. Damit Ihre Arbeit Warteschlange überleben könnten, system wird neu gestartet, wenn Sie sich entschieden haben, um es zu ermöglichen.
(Natürlich könnte man implementieren Sie eine einfache Warteschlange, wie Sie eine Tabelle in SQLlite oder jede andere SQL-system, wenn Sie wirklich wollen, dies zu tun; gerade über irgendeine Art von auto-increment index für die Sequenzierung und eine Spalte zu markieren, jedes Element hat "einfach gemacht" (verbraucht), aber das erfordert etwas mehr Komplexität als die mit dem, was Redis bietet Ihnen "out of the box").
Arbeiten für mich auf MacOSX