PyPy und queue.get_nowait()

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab eine einfache Schleife:

Code: Alles auswählen

    def display_queue_interval(self, interval):
        while True:
            try:
                cpu_cycles, op_address, address, value = self.display_queue.get_nowait()
            except Queue.Empty:
                break
            else:
                self.display.write_byte(cpu_cycles, op_address, address, value)
        self.root.after(interval, self.display_queue_interval, interval)
Obwohl ein get_nowait() nicht blockieren sollte und ein Queue.Empty werfen sollte, klappt das unter PyPy 2.3.1 unter windows nicht. Mit CPython funktioniert es wie es soll.

Hab schon verschiedenes als work-a-round probiert, aber ohne Erfolg :(

Bei https://docs.python.org/2.7/library/queue.html steht noch der Hinweis:
See also: collections.deque is an alternative implementation of unbounded queues with fast atomic append() and popleft() operations that do not require locking.
Könnte also collections.deque eine Alternative sein?

Wo genau liegt der Unterschied?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab mal collections.deque mit .append() und .popleft() probiert. Genau das selbe Verhalten: .popleft() blockiert und wirft kein IndexError, wenn es leer ist :(

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das gleiche Verhalten auch unter Linux mit pypy-2.3.1-linux_x86_64-portable

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich glaube es war doch kein richtiges Blockieren.

Habe nun zum einen ein maxsize gesetzt. Denke ansonsten kann es passieren, das die queue einfach zu voll wird.

Hab die Schleife auch einen timeout gegen, sieh ungefähr so aus:

Code: Alles auswählen

    def display_queue_interval(self, interval):
        max_time = time.time() + 0.25
        while True:
            try:
                cpu_cycles, op_address, address, value = self.display_queue.get_nowait()
            except Queue.Empty:
                break

            self.display.write_byte(cpu_cycles, op_address, address, value)
            if time.time() > max_time:
                log.critical("Abort display_queue_interval() loop.")
                break

        self.root.after(interval, self.display_queue_interval, interval)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich denke das hat alles was mit tkinter zu tun...

Habe nochmal an einigen stellen andere Einstellungen vorgenommen. Dabei kann man beobachten das manche komstelationen einfach nicht gut funktionieren und zu diesem komischen verhalten führen.
Ich vermute das setzten einer 'maxsize' war ausschlaggebend...

Dennoch Zweifel ich daran, das tkinter eine gute Idee ist.
Bieten GTK oder QT mehr was threading anbelangt?

Seit: wobei ich halt auch eine pypy Lösung möchte...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten