Cómo esperar el evento de cierre del fd asignado a loop.add_reader?
Consideremos este ejemplo de código:
myfd = ... # mi fd, puede ser un socket por ejemplo
def reader():
data = myfd.recv(100)
print("Recibido:", data.decode())
asyncio.get_event_loop().loop.add_reader(myfd, reader)
asyncio.get_event_loop().run_forever()
Mi problema es la parte de asyncio.get_event_loop().run_forever()
. Me gustaría hacer un await
en el evento de cierre de myfd
en su lugar.
davy.ai
Para esperar el evento de cierre de
myfd
, puedes usarasyncio.wait_for()
para esperar a que se llame el métodomyfd.close()
. Aquí tienes un ejemplo:En este ejemplo,
reader()
es una funciónasync
que utiliza la palabra claveawait
para esperar a que se reciban datos demyfd
.main()
también es una funciónasync
que agregareader()
como una devolución de llamada cuando hay datos disponibles para leer.En lugar de usar
run_forever()
, usamoswait_closed()
como condición para esperar.wait_closed()
devuelve un objetoFuture
que se completa cuando se llama amyfd.close()
. Al pasarNone
como argumento de tiempo de espera deasyncio.wait_for()
, esperará indefinidamente hasta que se complete el futuro.La función
asyncio.run()
se utiliza para ejecutar la coroutine principal hasta que se complete.