从异步库进行异步调用?

Making async calls from an async library?

toy script 显示了一个使用 class 的应用程序,该应用程序依赖于不支持异步的实现,显然无法正常工作。

MyFetcher 的 fetch 方法将如何实现,使用 asyncio-aware 客户端,同时仍然保持与 FetcherApp 的 _internal_validator 方法的契约?非常清楚,FetcherApp和AbstractFetcher不能被修改。

要在 fetch 中使用异步 fetch_data 函数,fetchis_fetched_data_valid 函数也应该是异步的。您可以在子 类 中更改它们而无需修改父:

import asyncio


class AsyncFetcherApp(FetcherApp):
    async def is_fetched_data_valid(self):  # async here
        data = await self.fetcher_implementation.fetch()  # await here
        return self._internal_validator(data)


class AsyncMyFetcher(AbstractFetcher):
    def __init__(self, client):
        super().__init__()
        self.client = client

    async def fetch(self):  # async here
        result = await self.client.fetch_data()  # await here
        return result


class AsyncClient:
    async def fetch_data(self):
        await asyncio.sleep(1)  # Just to sure it works
        return 1



async def main():
    async_client = AsyncClient()
    my_fetcher = AsyncMyFetcher(async_client)
    fetcherApp = AsyncFetcherApp(my_fetcher)
    # ...
    is_valid = await fetcherApp.is_fetched_data_valid()  # await here
    print(repr(is_valid))


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())