簡體   English   中英

嵌套 function 以異步方式調用 python

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM