如何检查asyncio事件循环内部状态?排查高并发程序挂起问题
高并发场景下asyncio程序挂起排查
我有一个基于asyncio开发的Python程序,在高并发场景中,程序的某一部分会出现挂起现象。我希望自行检查asyncio事件循环的状态,以此来定位问题根源,具体情况如下:
挂起代码片段
async def poll_buffer(self): while True: try: val = self.buffer.get(block=False) # 程序在此处挂起 await asyncio.gather(*[ cb(val) for cb in self.callbacks ]) except Empty: await asyncio.sleep(self.latency)
异常表现
奇怪的是,回调函数似乎根本没有开始执行——连最开头的打印语句都没有输出:
async def my_callback(val): print("HELLO") # 这行代码都未执行 await do_expensive_thing() # 更不会执行到此处
排查进展
- 问题仅在高并发场景下触发
- 已排查死锁问题,甚至移除了所有
asyncio.Lock,但情况并未改善 - 推测可能是调度问题,希望深入了解asyncio底层运行机制
- 程序其他异步部分通常能正常运行,但调试时也能触发它们挂起
更新:检查事件循环策略、asyncio.all_tasks()以及事件循环任务状态后,确认问题与asyncio事件循环无关。目前尚未完全明确原因,但发现函数调用中的错误被抑制了。
内容的提问来源于stack exchange,提问作者lmonninger
相关产品推荐
相关产品推荐

