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

使用缓存gRPC Channel时pytest多测试用例执行失败问题咨询

问题底层原因

这个问题的核心是gRPC Channel与事件循环的绑定关系 + pytest-asyncio默认事件循环的作用域冲突:

  1. pytest-asyncio 0.15.1版本默认的event_loop fixture作用域是function级别,也就是说每执行完一个测试用例,就会关闭并销毁当前的事件循环,下一个测试用例启动时会重新创建一个全新的事件循环。
  2. 你加了@lru_cache的客户端创建逻辑,会在第一个测试用例执行时生成Channel和Stub实例,这个Channel在初始化时会自动绑定当前正在运行的第一个测试用例的事件循环。
  3. 第一个测试执行完成后,绑定的事件循环被pytest销毁,后续测试拿到的缓存Channel关联的是已经被关闭的无效事件循环,无法处理新的gRPC请求,就会抛出超时错误或直接卡住。

两种解决方案的生效逻辑

  • 移除@lru_cache:每个测试用例调用get_cached_client时都会重新创建Channel,新Channel会自动绑定当前测试用例对应的存活事件循环,自然可以正常处理请求。
  • 重写event_loop fixture将作用域改为session/module级别:整个测试周期内只会创建一个事件循环,所有测试用例共享同一个存活的事件循环,缓存的Channel绑定的事件循环始终有效,不会出现无效引用的问题。

内容的提问来源于stack exchange,提问作者Seongik Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:15:03