You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IsolatedAsyncioTestCase中使用subprocess出现ResourceWarning如何解决

消除ResourceWarning的方案

两个警告分别对应两个资源未正确回收的问题,修改测试代码中的terminate逻辑即可:

  • 第一个subprocess is still running警告:你调用server.terminate()只是给子进程发送了终止信号,没有等待子进程完全退出并回收其状态,哪怕你肉眼观测子进程已经退出,内核中还会残留僵尸进程记录等待父进程回收,调用server.wait()即可解决。
  • 第二个unclosed file <_io.BufferedReader>警告:你创建子进程时指定了stdout=subprocess.PIPE,Python会自动打开一个管道文件对象关联子进程的标准输出,你没有显式关闭这个对象,垃圾回收阶段就会触发资源警告,显式调用server.stdout.close()即可解决。

修改后的对应代码段:

async def terminate():
    # connections closed here
    server.terminate()
    # 等待子进程退出,回收系统资源
    server.wait()
    # 显式关闭stdout管道对象
    server.stdout.close()

如果担心子进程收到SIGTERM后无法及时退出,也可以给wait设置超时,超时后发送SIGKILL强制杀死:

try:
    server.wait(timeout=3)
except subprocess.TimeoutExpired:
    server.kill()
    server.wait()
开启tracemalloc的方法

有两种常用方式:

  1. 命令行运行测试时指定环境变量,不需要修改代码:
PYTHONTRACEMALLOC=1 python -m unittest tests/test_basics.py
  1. 在测试脚本的最开头加入启动代码:
import tracemalloc
tracemalloc.start()

开启后再运行测试,ResourceWarning的提示中就会附带对应的对象分配回溯信息,方便定位未释放资源的位置。

内容的提问来源于stack exchange,提问作者Paul Whipp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 06:06:04