Questo è così rotto, spero che tu sia misericordioso con me:Come combinare callLater e addCallback?
reactor.callLater(0, myFunction, parameter1).addCallback(reactor.stop)
reactor.run()
myFunction
restituisce una differita.
spero sia chiaro quello che voglio fare:
- non appena il reattore è in esecuzione, voglio chiamare
myFunction
. Questo è il motivo per cui sto usando 0 come parametro di ritardo. Non c'è altro modo tranne callLater? Sembra divertente passare un ritardo di 0. - Voglio interrompere il reattore non appena
myFunction
ha completato l'operazione.
I problemi che ho finora:
AttributeError: DelayedCall instance has no attribute 'addCallback'
. Giusto! Come posso inserire una richiamata nella catena di callback avviata damyFunction
?exceptions.TypeError: stop() takes exactly 1 argument (2 given)
.
Per risolvere il secondo problema che ho dovuto definire una funzione speciale:
def stopReactor(result):
gd.log.info('Result: %s' % result)
gd.log.info('Stopping reactor immediatelly')
reactor.stop()
e cambiare il codice per:
reactor.callLater(0, myFunction, parameter1).addCallback(stopReactor)
reactor.run()
(ancora non funziona a causa del problema callLater, ma stopReactor
funzionerà ora)
Non c'è davvero nessun altro modo di chiamare reactor.stop
tranne da de multare una funzione extra?
Trovo questa opzione molto leggibile. Il bit 'lambda ignored' mi sembra magico: potresti chiarire cosa fa esattamente? – dangonfast
I callback su un differito vengono chiamati con un argomento. 'reactor.stop' non accetta argomenti. 'lambda ignorato: reactor.stop()' accetta e argomento, lo ignora e chiama 'reactor.stop' senza argomenti. –
Sarebbe un po 'più convenzionale scrivere: "lambda _: reactor.stop" – DonGar