繁体   English   中英

Python中的异步列表推导

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM