Estoy tratando de convertir una biblioteca síncrona para usar un marco IO asíncrono interno. Tengo varios métodos que se ven así:detonantes de llamada y generadores asíncronos de Python
def foo:
....
sync_call_1() # synchronous blocking call
....
sync_call_2() # synchronous blocking call
....
return bar
Para cada una de las funciones sincrónicas (sync_call_*
), he escrito una función asíncrona correspondiente que tiene un una devolución de llamada. P.ej.
def async_call_1(callback=none):
# do the I/O
callback()
Ahora la pregunta pitón novato - cuál es la forma más fácil de traducir los métodos existentes para utilizar estos nuevos métodos asincrónicos en su lugar? Es decir, el método foo()
anterior tiene que ser ahora:
def async_foo(callback):
# Do the foo() stuff using async_call_*
callback()
Una opción obvia es pasar una devolución de llamada en cada método asíncrono que efectivamente "reanuda" la función "foo" llamando, y luego llamar a la devolución de llamada mundial a el final del método Sin embargo, eso hace que el código sea frágil, feo y necesitaría agregar una nueva devolución de llamada para cada llamada a un método async_call_*
.
¿Hay una manera fácil de hacerlo usando una expresión de pitón, como un generador o coroutine?