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