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.
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.