Padrão assíncrono em pyqt? Ou padrão de chamada de fundo mais limpo?
Estou tentando escrever um programa curto (um arquivo pyqt) que seja responsivo (portanto, dependências fora do python / lxml / qt, especialmente aquelas que não posso ficar no arquivo, têm algumas desvantagens neste caso de uso, mas ainda posso estar disposto a experimentá-los). Estou tentando executar operações possivelmente longas (e canceláveis) em um thread de trabalho (na verdade, a operação em segundo plano tem um bloqueio ao redor para impedir várias operações de uma só vez (já que a biblioteca usada apenas pode ser usada uma chamada por vez) e timeouts, então gerar vários threads também seria bom).
Tanto quanto eu posso descobrir a maneira "básica" de fazer isso com o qt é. (o código da nota não foi testado, pode estar errado)
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())
(Estou usando o QTimer certo (ele roda em um thread diferente à direita)?)
Eu realmente preferiria ter algo mais simples e mais abstrato ao longo das linhas do assíncrono do c #. (note que eu não usei o assíncio, por isso posso estar errado)
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)
Ouvi dizer que o python 3 tinha recursos semelhantes e havia uma porta traseira, mas funciona corretamente com o qt?
Se alguém souber de outro padrão mais saudável. isso também seria útil / uma resposta aceitável.