Asynchrone Muster in pyqt? Oder sauberer Hintergrund Anrufmuster?

Ich versuche, ein kurzes Programm (eine Datei pyqt) zu schreiben, das reagiert (also haben Abhängigkeiten außerhalb von python / lxml / qt, insbesondere solche, die ich nicht einfach in der Datei festhalten kann, einige Nachteile für diesen Anwendungsfall, aber ich kann es trotzdem sein bereit, sie zu versuchen). Ich versuche, möglicherweise langwierige (und abbrechbare) Vorgänge für einen Arbeitsthread auszuführen (tatsächlich ist der Hintergrundvorgang mit einer Sperre versehen, um zu verhindern, dass mehrere Vorgänge gleichzeitig ausgeführt werden (da die verwendete Bibliothek nur jeweils einen Aufruf ausführen kann) Timeouts, bei denen mehrere Threads erzeugt werden, sind ebenfalls in Ordnung.

Soweit ich weiß, ist der "grundlegende" Weg, dies mit qt zu tun. (Hinweiscode wurde nicht getestet, kann also falsch sein)

class MainWindow(QWidget):
    #self.worker moved to background thread
    def initUI(self):
        ...
        self.cmd_button.clicked.connect(self.send)
        ...

    @pyqtslot()
    def send(self):
        ...
        ...#get cmd from gui
        QtCore.QTimer.singleShot(0, lambda : self.worker(cmd))


    @pyqtslot(str)
    def end_send(self, result):
        ...
        ...# set some gui to display result
        ...



class WorkerObject(QObject):    
   def send_cmd(self, cmd):
       ... get result of cmd
       QtCore.QTimer.singleShot(0, lambda: self.main_window.end_send())

(Benutze ich QTimer richtig (es läuft auf einem anderen Thread richtig)?)

Ich würde es wirklich vorziehen, etwas Einfacheres und Abstrahierteres im Sinne von c # 's Async zu haben. (Beachten Sie, dass ich kein Asyncio verwendet habe, damit ich möglicherweise ein paar Probleme habe.)

class MainWindow(QWidget):
    ...
    @asyncio.coroutine
    def send(self):
        ...
        ...#get cmd from gui
        result = yield from self.worker(cmd)
        #set gui textbox to result

class WorkerObject(QObject):
   @asyncio.coroutine
   def send_cmd(self, cmd):
       ... get result of cmd
       yield from loop.run_in_executor(None, self.model.send_command, cmd)

Ich habe gehört, dass Python 3 ähnliche Funktionen hat und es einen Back-Port gibt, aber funktioniert es mit qt richtig?

Wenn jemand ein anderes vernünftigeres Muster kennt. das wäre auch nützlich / eine akzeptable Antwort.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage