es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para esperar el evento de cierre de myfd, puedes usar asyncio.wait_for() para esperar a que se llame el método myfd.close(). Aquí tienes un ejemplo:

    myfd = ... # mi file descriptor, puede ser un socket por ejemplo
    
    async def reader():
        data = await myfd.recv(100)
        print("Recibido:", data.decode())
    
    async def main():
        asyncio.get_event_loop().add_reader(myfd.fileno(), reader)
        await asyncio.wait_for(myfd.wait_closed(), None)
    
    asyncio.run(main())
    

    En este ejemplo, reader() es una función async que utiliza la palabra clave await para esperar a que se reciban datos de myfd. main() también es una función async que agrega reader() como una devolución de llamada cuando hay datos disponibles para leer.

    En lugar de usar run_forever(), usamos wait_closed() como condición para esperar. wait_closed() devuelve un objeto Future que se completa cuando se llama a myfd.close(). Al pasar None como argumento de tiempo de espera de asyncio.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.

Comments are closed.