从异步库进行异步调用?
Making async calls from an async library?
toy script 显示了一个使用 class 的应用程序,该应用程序依赖于不支持异步的实现,显然无法正常工作。
MyFetcher 的 fetch 方法将如何实现,使用 asyncio-aware 客户端,同时仍然保持与 FetcherApp 的 _internal_validator 方法的契约?非常清楚,FetcherApp和AbstractFetcher不能被修改。
要在 fetch
中使用异步 fetch_data
函数,fetch
和 is_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())
toy script 显示了一个使用 class 的应用程序,该应用程序依赖于不支持异步的实现,显然无法正常工作。
MyFetcher 的 fetch 方法将如何实现,使用 asyncio-aware 客户端,同时仍然保持与 FetcherApp 的 _internal_validator 方法的契约?非常清楚,FetcherApp和AbstractFetcher不能被修改。
要在 fetch
中使用异步 fetch_data
函数,fetch
和 is_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())