簡體   English   中英

Python3.8 asyncio: RuntimeWarning: 從未等待協程

[英]Python3.8 asyncio: RuntimeWarning: coroutine was never awaited

我是異步函數的新手,我正在嘗試從外部 API 進行多次調用。concurrent.Futures 不足以檢索響應,所以我嘗試使用 asyncio 和 httpx,但該過程拋出錯誤未知且難以調試對我來說。

協程似乎有一個空值或從未被調用。

這是我的客戶

async def get_product_by_id_async(self, product_id: str) -> Response:
        if product_id is None:
            return None
        response_await = await self.async_client.get(
            url=f"{self.base_url}/api/catalog/stock{product_id}",
            headers=self.headers,
        )

        if response_await.status_code == 200:
            response = json.loads(response_await.text)
            return response

這是我的協調 function


async def async_get_products(data_parser):
    path = data_parser.options["path"]
    sku_list = client.run()
    products_list = []
    tasks = [await client.get_product_by_id(sku) for sku in sku_list]
    breakpoint()
    completed = await asyncio.gather(*tasks)
    for product in completed:
        products_list = build_product_df(products_list, product)
    products_df = pd.DataFrame(products_list)
    products_df.to_csv(path, index=False)
    return products_df

def products_processor_concurrent(data_parser):
    return async_get_products(data_parser)

在給出的解決方案之后,代碼中出現了一個新錯誤:這是跟蹤:

Traceback (most recent call last):
  File "manage.py", line 32, in <module>
    module.run()
  File "/opt/project/providers/api/data_collector.py", line 90, in run
    integrator.run()
  File "/opt/project/common/integrator.py", line 448, in run
    self.start_processing()
  File "/opt/project/providers/api/data_collector.py", line 81, in start_processing
    products.run()
  File "/opt/project/common/data_parser.py", line 94, in run
    self.build_dataframe()
  File "/opt/project/common/data_parser.py", line 54, in build_dataframe
    df = func(self)
  File "/opt/project/providers/data_collector.py", line 68, in products_processor_concurrent
    return run(async_get_products(data_parser))
  File "/usr/local/lib/python3.8/asyncio/runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "/usr/local/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/opt/project/providers/api/data_collector.py", line 57, in async_get_products
    tasks = [await client.get_product_by_id(sku) for sku in sku_list]
  File "/opt/project/providers/api/data_collector.py", line 57, in <listcomp>
    tasks = [await client.get_product_by_id(sku) for sku in sku_list]
TypeError: object dict can't be used in 'await' expression

當你想從同步函數運行異步函數時,你必須使用asyncio庫來運行它們。 你最后的 function 應該是這樣的。

def products_processor_concurrent(data_parser):
    from asyncio import run
    return run(async_get_products(data_parser))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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