我是異步函式的新手,我正在嘗試從外部 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
這是我的協調職能
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
uj5u.com熱心網友回復:
當你想從同步函式運行異步函式時,你必須使用asyncio庫來運行它們。你的最后一個函式應該是這樣的。
def products_processor_concurrent(data_parser):
from asyncio import run
return run(async_get_products(data_parser))
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/536360.html
標籤:Python熊猫应用程序接口python异步httpx
上一篇:從獲取的資料中洗掉一個專案反應
下一篇:將API回應推送到陣列
