【发布时间】:2021-01-31 09:49:07
【问题描述】:
我正在迈出 Python 的第一步,但我有点难以理解为什么我在这方面没有得到预期的结果。这是我想要实现的目标:
我有一个使用 API 的函数。在等待 API 回答并考虑到我正在通过一个会产生额外延迟的代理时,我认为发送并发请求会加快进程(我运行 100 个并发请求)。确实如此。但是 asyncio run_until_complete 总是返回一些未完成的协程。
这里是代码(简化):
import aiohttp
import asyncio
async def consume_api(parameter):
url = "someurl" #it is actually based on the parameter
try:
async with aiohttp.ClientSession() as session:
async with session.get(URL, proxy="someproxy") as asyncresponse:
r = await asyncresponse.read()
except:
global error_count
error_count += 1
if error_count > 50:
return "Exceeded 50 try on same request"
else:
return consume_api(parameter)
return r.decode("utf-8")
def loop_on_api(list_of_parameter):
loop = asyncio.get_event_loop()
coroutines = [consume_api(list_of_parameter[i]) for i in range(len(list_of_parameter))]
results = loop.run_until_complete(asyncio.gather(*coroutines))
return results
当我运行调试器时,loop_on_api 函数返回的results 包含一个字符串列表,对应于consume_api 的结果和<coroutine objects consume_api at 0x00...> 的一些出现。这些变量在 False 和 cr_Frame 处具有 cr_running 参数。
虽然如果我检查 coroutines 变量,我可以找到所有 100 个协程,但似乎没有一个有 cr_Frame。
知道我做错了什么吗?
我也在考虑我计算 50 错误的方式将被所有协程共享。
知道如何具体说明吗?
【问题讨论】:
标签: python python-asyncio aiohttp