如何等待分配给 loop.add_reader 的 fd 的关闭事件?

How to await on the closing event of the fd assigned to loop.add_reader?

让我们考虑这个示例代码:

myfd = ... # my fd, can be a socket for example

def reader():
    data = myfd.recv(100)
    print("Received:", data.decode())

asyncio.get_event_loop().loop.add_reader(myfd, reader)

asyncio.get_event_loop().run_forever()

我的问题是 asyncio.get_event_loop().run_forever() 部分。我想 await 代替 myfd 的关闭事件。

这是一个可能的解决方案:

myfd = ... # my fd, can be a socket for example

conn_closed = asyncio.Event() # <-- This is the solution

def reader():
    try:
      data = myfd.recv(100)
      print("Received:", data.decode())
    except EOFError: # connection closed
      conn_closed.set()
    except Exception as e:
      print(f"Unexpected Exception: {e}")
      conn_closed.set()

asyncio.get_event_loop().loop.add_reader(myfd, reader)

await conn_closed.wait()