【发布时间】:2022-08-13 22:59:55
【问题描述】:
假设我有一些要异步运行的任务。
我想异步进行一系列 4 个 API 调用,但我也想有另一个异步函数检查我的会话状态。
使用asyncio 我尝试过:
import aiohttp
import asyncio
async def make_request():
async with aiohttp.ClientSession() as session:
async with session.get(\'http://httpbin.org/get\') as resp:
print(resp.status)
print(await resp.text())
return resp
async def say_hello():
print(\"Hello\")
async def main():
tasks = []
for i in range(4):
tasks.append(asyncio.create_task(make_request()))
results = await asyncio.gather(*tasks, say_hello(),)
if __name__ == \"__main__\":
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(main())
实际上,我的say_hello() 正在检查状态并更新类属性(会话),同时根据设定的时间频率发出请求。我如何才能在make_request() 中完成与我的实际 API 调用执行一起运行的这个“状态”函数,它返回一个响应对象,我稍后在完成时处理该对象。
-
据我所知,您应该将
()添加到make_request,即tasks.append(asyncio.create_task(make_request())) -
@bzu 好的,是的,这是一个错字,但不是我的问题。我希望结果不包括从
say_hello()返回的None结果,或者我只需要一个额外的过程来从产生的results中过滤掉None -
如果您不想在结果列表中出现 None,只需将其丢弃即可。在 main 结束前添加一行
results = [a for a in results if a is not None]。然而,Andrej Kessaly 的回答是一个更好的解决方案。
标签: python asynchronous async-await python-asyncio aiohttp