Pregunta

¿alguien utiliza PyQt con GEvent? ¿Cómo vincular bucle PyQt a la GEvent?

http://www.gevent.org/ - biblioteca de red basada en Python corrutina que los usos a Greenlet proporcionar una API síncrona de alto nivel en la parte superior de bucle de eventos libevent.

¿Fue útil?

Solución

Así es como tendría que cambiar pyqt por session1 de ejemplo para cooperar: https: // github.com/traviscline/pyqt-by-example/commit/b5d6c61daaa4d2321efe89679b1687e85892460a

Otros consejos

Puede utilizar un IDLE Qt "temporizador" para permitir gevent para el procesamiento de sus microfiletes mientras hay eventos Qt manejados por un corto período de tiempo, por ejemplo 10 milisegundos. Todavía no es perfecto, ya que no da a la "suave" posible integración. Esto se debe a que no utilizamos un solo bucle de eventos tanto para Qt y GEvent, sólo "entrelazado" en el tiempo.

La solución correcta sería la de permitir libevent para que escuche en nuevos eventos de Qt de alguna manera, pero no he sido capaz de averiguar cómo hacer que en la práctica todavía. Tal vez tener Qt para enviar algo a través de una toma GEvent cuando un evento de interfaz gráfica de usuario llega a la cola de eventos ayudaría. Alguien ha resuelto que?

Ejemplo de trabajo:

""" 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()

He intentado el siguiente enfoque: a tener un "PyQt backend" para GEvent, es decir. una implementación de la GEvent toma de bucle uso de construcciones PyQt como QSocketNotifier, QTimer, etc., en lugar del bucle libev. Finalmente lo encontré mucho más fácil que hacer lo contrario, y el rendimiento es muy bueno (bucle de Qt se basa en la labia bajo Linux, no es tan malo).

Aquí está el enlace al proyecto en GitHub para los interesados: https://github.com/mguijarr/qtgevent

Esto es sólo un comienzo, pero funciona bien para las pruebas que hice. Yo sería feliz si las personas con más experiencia con GEvent y PyQt podrían contribuir.

sould evitar el uso app.exec_ (), que es una función de bucle que utilizan esta función para eventos de proceso:

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

para que pueda llamar directamente processEvents.

Me dio a conocer un proyecto llamado eventlet-pyqt . Espero que podría ser útil para el que desea utilizar en su aplicación greenlet PyQt. También probé GEvent, pero era difícil para mí escribir un plugin para libevent debido a mi mala experiencia en lenguaje C. El problema utilizando principal QApplicaton::processEvents() o una QTimer cero intervalo es, el programa de gestión en bucle infinito, provoca 100% de uso de núcleo de la CPU. Para evitar esto, escribí un nuevo centro para reemplazar la función select() con QSocketNotifier de PyQt. Esperamos que este mensaje podría ayudar a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top