为什么我收到 python-httpx 未关闭对象警告?

Why am I getting python-httpx Unclosed object warning?

我做错了什么?有解决办法吗?我是异步编程的新手;非常混乱。

# myFile.py
import httpx
async def ping_api():
    async with httpx.AsyncClient() as client:
        sleep(1)
        print('right after with')
        sleep(1)
        print('before await')
        sleep(1)
        response = await client.get(url, params=params)
        sleep(1)
        print('after await')
        sleep(1)
        data = response.json() # what's wrong here?
        sleep(1)
        print('after json')
        sleep(1)

    return data



# myFastAPI.py
from myFile import ping_api
@app...
async def main():
    data = await ping_api()

 

产生的错误:

before await
after await
C:\Users\foo\grok\site-packages\httpx\_client.py:1772: UserWarning: Unclosed <authlib.integrations.httpx_client.oauth2_client.AsyncOAuth2Client object at 0x0000021F318EC5E0>. See https://www.python-httpx.org/async/#opening-and-closing-clients for details.
warnings.warn(
after json

上下文管理器不应该自动关闭连接吗? 这是库中的错误还是我遗漏了什么? 这是 response.json() 的原因还是其他地方的问题但恰好在这一点上 'print'?

https://github.com/encode/httpx/issues/1332

找到原因: 问题实际上是我对另一个库的使用(tda-api)。找到答案 Here; “不要尝试在每个令牌文件中使用多个客户端对象,因为 这可能会导致底层 OAuth2 会话管理出现问题”。我的错误是导致函数调用中的错误 'printing' 与我没有明显关系(例如 datetime.combine(),response.json())。我没有在函数内调用客户端对象的创建,而是在外部创建它,并将客户端对象作为参数参数传递给我的各种异步 def 函数。

sync def 函数中不会出现该错误,因为它在返回之前的任何时候都不会将线程交给事件循环。这意味着没有同时调用并发的 Client 对象。因此,在同步情况下 1:1 Client object:token 文件比率没有被违反,并且在函数内部创建 Client 对象不是问题。