3 Stimmen

Sortierte, simultane Warteschlangenimplementierung (verdreht) mit sqlite?

Ich möchte eine Anwendung mit dem Twisted-Framework entwerfen, die mit einigen Deferreds mehrfeldige Elemente in eine Warteschlange einfügt.

Die Anwendung verbraucht die Warteschlange mit anderen Deferreds. Das Problem ist, dass ich die Warteschlangenelemente nicht in der Reihenfolge der Hinzufügung verbrauchen möchte, sondern einigen Elementen basierend auf dem Feldinhalt eine höhere Priorität einräumen möchte.

Meine derzeitige (wahrscheinlich fehlerhafte) Idee war es, einen Generator zu haben, der ein SQL-Select ausführt, das ein Ergebnis mit der richtigen Priorität erzeugt, und über dieses Ergebnis iteriert, um Deferreds zu erzeugen. Das Problem ist, dass während der Generator über das Ergebnis iteriert, weitere Elemente durch Deferreds zur Warteschlange hinzugefügt werden können.

Gibt es eine Möglichkeit, dies zu tun, ohne jedes Mal, wenn der Generator aufgerufen wird, ein neues Select auszuführen? Kann das "Ergebnisset" und der Iteratorcursor automatisch "aktualisiert" werden?

Falls nicht, wie würden Sie dies implementieren?

2voto

Raymond Hettinger Punkte 197261

Das Queue-Modul verfügt über eine PriorityQueue-Klasse, die Ihren Anforderungen entsprechen könnte.

0 Stimmen

Danke. PriorityQueue ist genau das, wonach ich gesucht habe.

1voto

jsbueno Punkte 84804

Warum verwenden Sie nicht eine Python-Liste und das Modul "heapq" aus der Standardbibliothek, um sie in priorisierter Reihenfolge zu halten? (Ihre Listenlemente wären Tupel mit (Priorität, Einfügezeit, Objekten) - und da die Daten in einer normalen Python-Liste gehalten werden, können Sie sie ohne Probleme in einer Twisted-App übergeben.

Ich glaube, es wäre einfacher als sqlite zu verwenden, wenn alles, was Sie brauchen, nach Priorität sortiert ist.

(In dieser Antwort stelle ich ein Beispiel für die Verwendung von heapq vor, das hilfreich sein könnte: heapq mit benutzerdefinierter Vergleichsprädikat)

0 Stimmen

Ich denke nicht, dass das heruntergestimmt werden sollte. Es ist eine vernünftige Antwort.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X