Seite 1 von 1

[Erledigt] Queue: Reihenfolge der Elemente

Verfasst: Dienstag 28. August 2007, 10:45
von ChrisGTJ
Hallo noch mal,

wie ist die Reihenfolge der Daten in einer Queue, FIFO, LIFO?

In der Konsole ergibt sich folgendes:

Code: Alles auswählen

dataQueue = Queue()
dataQueue.put(1)
dataQueue.put(2)
dataQueue.put(3)
print dataQueue.get()
1
print dataQueue.get()
2
print dataQueue.get()
3
Meine Fragen sind:

- Verhält sich die Queue immer so, wie ein FIFO?
- Gibt es ein pop(), um LIFO-Verhalten zu erzwingen?

In meinem Progrämmchen mit 2 Threads habe ich etwas anderes beobachtet, da schienen sich laufzeitabhängig Einträge zu "überholen" bzw. Daten zu "fehlen":

Code: Alles auswählen

Thread 1:
dataQueue.put(1)
dataQueue.put(2)
dataQueue.put(3)
dataQueue.put(4)
dataQueue.put(5)
dataQueue.put(6)

Thread 2:
print dataQueue.get()
1
print dataQueue.get()
2
print dataQueue.get()
5
Ich habe die Queue nicht ganz ausgelesen. Wenn ich das tue, dann sind wieder alle Daten zu sehen, auch in der richtigen Reihenfolge. Das sieht für mich so aus, als ob ich einen Fehler im Programm habe, wenn das Verhalten einer Queue klar definiert ist...

Gruß und Danke,

Christoph

Verfasst: Dienstag 28. August 2007, 10:57
von keppla
- Verhält sich die Queue immer so, wie ein FIFO?
Meines Wissens ja, deshalb ist es ja ein Queue (warteschlange, wie beim supermarkt)
- Gibt es ein pop(), um LIFO-Verhalten zu erzwingen?
wozu würdest du das brauchen? Afaik wird ein Queue typischerweise dazu genutzt, von vielen kleinen Empfängerthreads Dinge an den oder die Workerthreads weiterzugeben, und da will man ja üblicherweise in der eingangsreihenfolge bedienen.
- Gibt es ein pop(), um LIFO-Verhalten zu erzwingen?
Wenns nicht in der Doku steht, wohl nicht.
In meinem Progrämmchen mit 2 Threads habe ich etwas anderes beobachtet, da schienen sich laufzeitabhängig Einträge zu "überholen" bzw. Daten zu "fehlen":
Das wundert mich. Könntest du den Quelltext mal Posten?

Verfasst: Dienstag 28. August 2007, 11:08
von ChrisGTJ
Danke für die Antwort, Keppla.

Die Sache hat sich eben tatsächlich erledigt, es war ein "Feature". Es ist immer gut, wenn man über soetwas spricht, dann fallen einem so die kleinen Fallen auf.

Mein Fehler oder besser das Feature war, daß die Daten aus der Queue in zwei Listen sortiert worden sind (abhängig vom Inhalt). Auf diese Listen habe ich dann per Index zugegriffen und dieser war bei den "fehlenden" Daten einfach schon etwas fortgeschritten. Peinlich, peinlich, deshalb eine Frage ins Forum zu schreiben.

Thanks for listening, ich habe die Überschrift geändert, damit keiner mehr Nachdenken muß.

@Keppla:
Das pop() wäre interessant, wenn man verschiedene Prioritäten der Nachrichten implementieren wollte, allerdings bräuchte man dann auch soetwas wie addHead() und addTail() um die Elemente gezielt vorn oder hinten in die Schlange einreihen zu können.

Gruß und Danke,

Christoph

Verfasst: Dienstag 28. August 2007, 11:33
von keppla
Das pop() wäre interessant, wenn man verschiedene Prioritäten der Nachrichten implementieren wollte, allerdings bräuchte man dann auch soetwas wie addHead() und addTail() um die Elemente gezielt vorn oder hinten in die Schlange einreihen zu können.
Dafür nutzt man besser einen Priority Queue.

Hier wäre eine implementation: http://aspn.activestate.com/ASPN/Cookbo ... cipe/87369

Verfasst: Dienstag 28. August 2007, 12:13
von ChrisGTJ
keppla hat geschrieben:
Das pop() wäre interessant, wenn man verschiedene Prioritäten der Nachrichten implementieren wollte, allerdings bräuchte man dann auch soetwas wie addHead() und addTail() um die Elemente gezielt vorn oder hinten in die Schlange einreihen zu können.
Dafür nutzt man besser einen Priority Queue.

Hier wäre eine implementation: http://aspn.activestate.com/ASPN/Cookbo ... cipe/87369
Ok, der Name sagt schon alles. Danke :)

Christoph