为什么在异步函数中使用httpx时线程不关闭?

问题描述 投票:0回答:1

我正在 jupyter 笔记本中运行 python 代码(3.10.14)。但是,当我在单元格中运行异步函数(AsyncClient.get(...) from httpx v0.27.0)时,我看到其中一个线程仍然处于活动状态 - 即使上下文管理器已关闭。如果我理解正确的话,这可能会导致内存泄漏等问题。

我运行的代码如下(jupyter笔记本):

import httpx
import threading
import time

async def fetch():
    url = "https://jsonplaceholder.typicode.com/todos/1"
    async with httpx.AsyncClient() as client:
        response = await client.get(url)
        return response.text

print("Threads before", threading.active_count())
res = await fetch()

time.sleep(2) # small sleep to make sure maybe it will close
print("Threads after", threading.active_count())

输出:

Threads before 7
Threads after 8

在这种情况下,我希望执行前后的线程数保持不变。

任何关于我做错了什么或为什么我的理解不正确的建议都会对我有很大帮助。谢谢大家的回答。

python multithreading asynchronous python-asyncio httpx
1个回答
0
投票

Jupyter Notebook 有自己的处理事件循环的方式,有时会与 asyncio 的事件循环发生冲突。

尝试修改后的代码:

# Change to await the asyncio task properly
await asyncio.run(main())
© www.soinside.com 2019 - 2024. All rights reserved.