Frage

Hat jemand PyQt mit GEVENT verwendet? Wie PyQt Schleife GEVENT zu verknüpfen?

http://www.gevent.org/ - Koroutine-basierte Python Vernetzung Bibliothek, dass Anwendungen Greenlet zu bietet einen High-Level-API synchronen oben auf libevent Ereignisschleife.

War es hilfreich?

Lösung

Hier ist, wie man am Beispiel der session1 ändern pyqt würde zu kooperieren: https: // github.com/traviscline/pyqt-by-example/commit/b5d6c61daaa4d2321efe89679b1687e85892460a

Andere Tipps

Sie können einen Qt IDLE „Timer“ verwenden gevent, damit für seine Microthreads verarbeiten, während keine Qt Ereignisse für einen kurzen Zeitraum behandelt, beispielsweise 10 Millisekunden. Es ist noch nicht perfekt, da sie nicht die „glatte“ mögliche Integration nicht geben. Es liegt daran, dass wir nicht eine einzige Ereignisschleife sowohl für Qt und GEVENT verwenden, nur „Verschachtelung“, um sie in der Zeit.

Die richtige Lösung wäre libevent zu ermöglichen, sich auf neue Qt Ereignisse zu hören irgendwie, aber ich habe nicht in der Lage gewesen, um herauszufinden, wie das in der Praxis noch zu tun. Vielleicht mit Qt etwas GEVENT über eine Steckdose zu senden, wenn ein GUI-Ereignis in das Ereignis eintrifft würde Warteschlange helfen. Hat jemand das gelöst?

Arbeits Beispiel:

""" Qt - gevent event loop integration using a Qt IDLE timer
"""

import sys, itertools

import PySide
from PySide import QtCore, QtGui

import gevent

# Limit the IDLE handler's frequency while still allow for gevent
# to trigger a microthread anytime
IDLE_PERIOD = 0.01

class MainWindow(QtGui.QMainWindow):

    def __init__(self, application):

        QtGui.QMainWindow.__init__(self)

        self.application = application

        self.counter = itertools.count()

        self.resize(400, 100)
        self.setWindowTitle(u'Counting: -')

        self.button = QtGui.QPushButton(self)
        self.button.setText(u'Reset')
        self.button.clicked.connect(self.reset_counter)

        self.show()

    def counter_loop(self):

        while self.isVisible():
            self.setWindowTitle(u'Counting: %d' % self.counter.next())
            gevent.sleep(0.1)

    def reset_counter(self):

        self.counter = itertools.count()

    def run_application(self):

        # IDLE timer: on_idle is called whenever no Qt events left for processing
        self.timer = QtCore.QTimer()
        self.timer.timeout.connect(self.on_idle)
        self.timer.start(0)

        # Start counter
        gevent.spawn(self.counter_loop)

        # Start you application normally, but ensure that you stop the timer
        try:
            self.application.exec_()
        finally:
            self.timer.stop()

    def on_idle(self):

        # Cooperative yield, allow gevent to monitor file handles via libevent
        gevent.sleep(IDLE_PERIOD)

def main():

    application = QtGui.QApplication(sys.argv)
    main_window = MainWindow(application)
    main_window.run_application()

if __name__ == '__main__':
    main()

Ich habe versucht, den folgenden Ansatz: ein „PyQt Backend“ haben für GEVENT, dh. eine Implementierung des Schleifen GEVENT EINSATZ PyQt Konstrukte wie QSocketNotifier, QTimer usw. anstelle der libev Schleife. Schließlich fand ich es viel einfacher, als das Gegenteil zu tun, und die Leistung ist sehr gut (Qt-Schleife auf der glib unter Linux basiert, ist es nicht so schlecht).

Hier ist der Link zu dem Projekt auf Github für Interessenten: https://github.com/mguijarr/qtgevent

Dies ist nur ein Anfang, aber es funktioniert gut für die Tests, die ich tat. Ich würde mich freuen, wenn die Leute mit mehr Erfahrung mit GEVENT und PyQt beitragen könnten.

sould Sie verwenden app.exec_ (), es ist eine Loop-Funktion, die Sie mit dieser Funktion Prozessereignisse vermeiden

http://doc.qt.nokia.com/stable/qcoreapplication. html # process

, so dass Sie direkt process aufrufen können.

Ich veröffentlichte ein Projekt mit dem Namen eventlet-pyqt . Ich hoffe, es könnte für den einen sinnvoll sein, die greenlet in ihrer PyQt Anwendung verwenden möchten. Ich versuchte GEVENT auch, aber es war schwierig für mich, ein Plugin für libevent zu schreiben wegen meiner schlechten C-Sprache Erfahrung. Das Hauptproblem unter Verwendung von QApplicaton::processEvents() oder ein Null-Intervall QTimer ist, die in den Endlosschleife läuft Programm verursacht 100% CPU-Kern Nutzung. Um dies zu vermeiden, schrieb ich eine neue Nabe die select() Funktion mit PyQt des QSocketNotifier zu ersetzen. Hoffen, dass diese Nachricht jemand helfen könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top