913
32.5
Wie können Prozesse Objekte austauschen?
#3: Eines der beiden Verbindungsobjekte (b) wird an den neuen Prozess übergeben.
#4: Der Hauptprozess wartet, bis ein Objekt an die Pipe gesendet worden ist, und über-
nimmt es dann.
#5: Der Hauptprozess wartet, bis der Prozess p terminiert.
Abb. 32.1: Pipe (oben) und Queue (unten)
32.5.3 Objekte über eine Queue austauschen
Eine Queue (engl. queue = Schlange) ist eine Datenstruktur, die sich wie eine Warteschlange
vor dem Sicherheitscheck am Flughafen verhält. An der einen Seite stellen sich die Flug-
gäste an, an der anderen Seite verteilen sie sich auf die Fließbänder der Sicherheitschecks.
Mit einer Anweisung der Form
erzeugen Sie ein neues Queue-Objekt. Mit
put() kann ein Prozess ein neues Item an das
Ende der Schlange hängen. Mit
get() kann er ein Item vorn aus der Schlange entfernen
(siehe Abbildung 32.1).
Queue-Objekte sind prozesssicher, das heißt, sie regeln alle Koordinationsprobleme, die
auftreten können, wenn Prozesse auf sie zugreifen. Welche Probleme sind das? Was kann
schieflaufen?
1. Problem: Die Queue ist leer und ein Prozess fordert mit
get() ein neues Item an. In die-
sem Fall blockiert die Queue den Prozess so lange, bis sie ein Element enthält und die
get()-Operation ausgeführt werden kann.
2. Problem: Die Schlange ist vollständig gefüllt und kann keine weiteren Elemente mehr
aufnehmen. Dennoch versucht ein Prozess mit
put() ein weiteres Item in die Schlange
zu bringen. Die einzige Möglichkeit für die Schlange ist nun, den Produzenten schlafen
zu legen, bis wieder Platz ist, und später dann wieder aufzuwecken, damit er die
put()-
Operation zu Ende ausführen kann.
Das folgende Beispiel illustriert die Verwendung einer Queue zur Datenkommunikation.
Die Grundidee ist, dass bei der Erzeugung eines Kindprozesses diesem eine Queue als
zusätzliches Argument übergeben wird (#2). Der Kindprozess setzt sein Ergebnis an das
Ende diese Queue (
#1). Der Hauptprozess holt sich dann das Ergebnis aus der Queue (#3).
q = Queue()
a.send()
a.recv()
b.send()
b.recv()
q.put() q.get()
q
a
b

Get Python 3 - Lernen und professionell anwenden now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.