[Erledigt] Queue: Reihenfolge der Elemente

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Dienstag 28. August 2007, 10:45

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
Zuletzt geändert von ChrisGTJ am Dienstag 28. August 2007, 11:00, insgesamt 1-mal geändert.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 28. August 2007, 10:57

- 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?
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Dienstag 28. August 2007, 11:08

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
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Dienstag 28. August 2007, 11:33

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
ChrisGTJ
User
Beiträge: 105
Registriert: Mittwoch 22. August 2007, 15:45

Dienstag 28. August 2007, 12:13

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
Antworten