[英]Nested function call in async way python
我有一个 api 一次只返回 10 条记录的分页响应。 我想处理 10 条记录(索引=0 和限制=10),然后处理下 10 条记录(索引=10 和限制=10),依此类推,直到它返回空数组。
我想以异步方式进行。
我正在使用以下部门:
yarl==1.6.0
Mako==1.1.3
asyncio==3.4.3
aiohttp==3.6.2
代码是:
loop = asyncio.get_event_loop()
loop.run_until_complete(getData(id, token,0, 10))
logger.info("processed all data")
async def getData(id, token, index, limit):
try:
async with aiohttp.ClientSession() as session:
response = await fetch_data_from_api(session, id, token, index, limit)
if response == []:
logger.info('Fetched all data')
else:
# process data(response)
getData(session, id, limit, limit+10)
except Exception as ex:
raise Exception(ex)
async def fetch_data_from_api(
session, id, token, index, limit
):
try:
url = f"http://localhost:8080/{id}?index={index}&limit={limit}"
async with session.post(
url=url,
headers={"Authorization": token}
) as response:
response.raise_for_status()
response = await response.json()
return json.loads(json.dumps(response))
except Exception as ex:
raise Exception(
f"Exception {ex} occurred"
)
我的问题是它第一次工作正常但是当我再次从 async def getData(id, token, index, limit) 调用方法 getData(session, id, limit, limit+10) 时。 它没有被调用。
我该如何解决这个问题?
我在您的代码中看到了一些问题。
首先,这就是您所说的,是getData
方法。 通过查看代码,我有点不清楚“第二个” getData
是什么。 在 function 定义中,您的 arguments 是getData(id, token, index, limit)
,但是当您从 function 中调用它时,您使用getData(session, id, limit, limit+10)
调用它,其中id
是第二个参数. 那是故意的吗? 在我看来,这好像还有另一个getData
方法,或者它是一个错误。
如果是第一个选项:(a) 您可能还需要向我们展示该代码,因为这对我们能够给您更好的响应很重要,并且 (b),更重要的是,它不起作用。 Python 不支持重载,并且您在包装getData
中引用的getData
是相同的包装方法。
如果是第二个选项:(a) 您可能遇到 function 参数问题,以及 (b) - 您在getData
之前缺少await
(即await getData
)。 如果它是“第一选择”,这实际上也可能是相关的。
除此之外,您的异常处理是多余的。 您基本上只是重新引发异常,所以我认为拥有try-catch
块没有任何意义。 更重要的是,出于某种原因,在第一种方法中,您从基本异常 class 创建了一个Exception
(不要与BaseException
混淆)。 只是没有try
块。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.