Seite 1 von 1

PyPy und queue.get_nowait()

Verfasst: Donnerstag 7. August 2014, 17:55
von jens
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?

Re: PyPy und queue.get_nowait()

Verfasst: Donnerstag 7. August 2014, 18:03
von jens
Hab mal collections.deque mit .append() und .popleft() probiert. Genau das selbe Verhalten: .popleft() blockiert und wirft kein IndexError, wenn es leer ist :(

Re: PyPy und queue.get_nowait()

Verfasst: Donnerstag 7. August 2014, 19:21
von jens
Das gleiche Verhalten auch unter Linux mit pypy-2.3.1-linux_x86_64-portable

Re: PyPy und queue.get_nowait()

Verfasst: Donnerstag 7. August 2014, 21:56
von jens
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)

Re: PyPy und queue.get_nowait()

Verfasst: Freitag 8. August 2014, 07:51
von jens
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...