[英]Async List Comprehensions in Python
是否可以在Python中异步进行列表理解? 我正在尝试对Web API进行多次调用,其中大部分等待时间都在等待数据返回,而我想异步进行。 然后,在提取数据之后,我想返回数据并将其存储在变量中。 我将如何去做呢?
以下是非异步代码:
api_data = [{data_name: get_data(data_name)} for data_name in data_name_list]
以下是我尝试的异步解决方案:
async def get_api_data(data_name_list):
api_data = [{data_name: get_data(data_name)} for data_name in data_name_list]
await asyncio.wait(api_data)
await conn.close()
return api_data
data = get_api_data(data_name_list)
问题是api_data
作为coroutine object
返回。 自从我关闭连接后,它不应该不作为coroutine object
返回吗? 有没有更好的方法可以将我的non asynchronous code
转换为asynchronous solution
?
是的,确实可以触发多个请求并异步等待它们。 由于Python传统上是一种同步语言,因此您必须非常小心与异步Python一起使用的库。 任何阻塞主线程的库(例如requests
)都将破坏您的整个异步性。 aiohttp
是在Python中异步进行Web API调用的常见选择。 您想要的是在Python列表内创建一堆将来的对象,然后等待它。 未来是一个对象,它表示最终将解决的问题。
编辑:由于实际上进行API调用的函数是同步和阻塞的,并且您无法对其进行控制,因此您将不得不在单独的线程中运行该函数。
import asyncio
async def main():
loop = asyncio.get_event_loop()
futures = [asyncio.ensure_future(loop.run_in_executor(None, get_data, data)) for data in data_name_list]
await asyncio.gather(*futures) # wait for all the future objects to resolve
# Do something with futures
# ...
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
请注意,这是Python 3.6代码,与3.7+异步代码可能会有很大不同
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.