使用缓存gRPC Channel时pytest多测试用例执行失败问题咨询
问题底层原因
这个问题的核心是gRPC Channel与事件循环的绑定关系 + pytest-asyncio默认事件循环的作用域冲突:
- pytest-asyncio 0.15.1版本默认的
event_loopfixture作用域是function级别,也就是说每执行完一个测试用例,就会关闭并销毁当前的事件循环,下一个测试用例启动时会重新创建一个全新的事件循环。 - 你加了
@lru_cache的客户端创建逻辑,会在第一个测试用例执行时生成Channel和Stub实例,这个Channel在初始化时会自动绑定当前正在运行的第一个测试用例的事件循环。 - 第一个测试执行完成后,绑定的事件循环被pytest销毁,后续测试拿到的缓存Channel关联的是已经被关闭的无效事件循环,无法处理新的gRPC请求,就会抛出超时错误或直接卡住。
两种解决方案的生效逻辑
- 移除
@lru_cache:每个测试用例调用get_cached_client时都会重新创建Channel,新Channel会自动绑定当前测试用例对应的存活事件循环,自然可以正常处理请求。 - 重写
event_loopfixture将作用域改为session/module级别:整个测试周期内只会创建一个事件循环,所有测试用例共享同一个存活的事件循环,缓存的Channel绑定的事件循环始终有效,不会出现无效引用的问题。
内容的提问来源于stack exchange,提问作者Seongik Kim
相关产品推荐
相关产品推荐

