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的方法
有两种常用方式:
- 命令行运行测试时指定环境变量,不需要修改代码:
PYTHONTRACEMALLOC=1 python -m unittest tests/test_basics.py
- 在测试脚本的最开头加入启动代码:
import tracemalloc tracemalloc.start()
开启后再运行测试,ResourceWarning的提示中就会附带对应的对象分配回溯信息,方便定位未释放资源的位置。
内容的提问来源于stack exchange,提问作者Paul Whipp
相关产品推荐
相关产品推荐

