PEP 0492 thêm phương thức ma thuật __await__
mới. Đối tượng triển khai phương thức này sẽ trở thành đối tượng tương lai giống như và có thể được chờ đợi bằng cách sử dụng await
. Rõ ràng:Làm thế nào tôi có thể chờ đợi bên trong của đối tượng tương lai __await__?
import asyncio
class Waiting:
def __await__(self):
yield from asyncio.sleep(2)
print('ok')
async def main():
await Waiting()
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
Ok, nhưng những gì nếu tôi muốn gọi một số async def
được xác định chức năng thay vì asyncio.sleep
? Tôi không thể sử dụng await
vì __await__
không phải là async
chức năng, tôi không thể sử dụng yield from
vì coroutines bản địa đòi hỏi await
biểu:
async def new_sleep():
await asyncio.sleep(2)
class Waiting:
def __await__(self):
yield from new_sleep() # this is TypeError
await new_sleep() # this is SyntaxError
print('ok')
Làm thế nào tôi có thể giải quyết nó?
Có lý do gì khiến bạn không thể thực hiện nó như một hàm không đồng bộ riêng biệt bên trong lớp Chờ đợi không? Vì vậy, chờ đợi Waiting.new_sleep()? – shongololo