Esto es tan roto, espero que eres misericordioso conmigo:¿Cómo combinar callLater y addCallback?
reactor.callLater(0, myFunction, parameter1).addCallback(reactor.stop)
reactor.run()
myFunction
devuelve un diferido.
espero que sea claro lo que quiero hacer:
- tan pronto como el reactor está en funcionamiento, quiero llamar
myFunction
. Es por eso que estoy usando 0 como el parámetro de retraso. ¿No hay otra manera que llamar a CallLater? Parece divertido pasar un retraso de 0. - Quiero detener el reactor tan pronto como
myFunction
ha completado la tarea.
Los problemas que tengo hasta ahora:
AttributeError: DelayedCall instance has no attribute 'addCallback'
. ¡Lo suficientemente justo! ¿Cómo coloco una devolución de llamada en la cadena de devolución de llamada iniciada pormyFunction
?exceptions.TypeError: stop() takes exactly 1 argument (2 given)
.
Para resolver el segundo problema tuviera que definir una función especial:
def stopReactor(result):
gd.log.info('Result: %s' % result)
gd.log.info('Stopping reactor immediatelly')
reactor.stop()
y cambiar el código para:
reactor.callLater(0, myFunction, parameter1).addCallback(stopReactor)
reactor.run()
(aún no funciona debido al problema callLater, pero stopReactor
funcionará ahora)
¿No hay realmente otra manera de llamar a reactor.stop
excepto por de multando una función extra?
Encuentro esta opción muy legible. El bit 'lambda ignored' me parece mágico: ¿podrías aclarar qué es exactamente lo que hace? – dangonfast
Las rellamadas en un aplazado se llaman con un argumento. 'reactor.stop' no toma ningún argumento. 'lambda ignored: reactor.stop()' acepta y argumento, lo ignora y llama a 'reactor.stop' sin argumentos. –
Sería un poco más convencional escribir: 'lambda _: reactor.stop' – DonGar