如何确保异步消息处理器按接收顺序启动执行?
异步消息处理器的顺序执行需求
假设我们有一个消息处理器,消息从TCP套接字接收后分派给处理器,初始实现如下:
async def on_recv(msg): await handle(msg) while True: msg = await socket.recv() await on_recv(msg)
这种写法存在问题:如果handle耗时较长,或者需要等待套接字响应,会导致死锁(on_recv无法返回,后续消息无法接收)。为了避免阻塞消息接收,我们可以将handle包装成异步任务:
async def on_recv(msg): asyncio.create_task(handle(msg)) # 注:原代码拼写错误,应为asyncio而非asynico
但这种方式无法保障处理器的启动顺序——任务的执行调度权完全交给asyncio.Task,无法按消息接收的顺序确定性地启动处理器执行。我的需求是:确保每个处理器严格按消息接收顺序启动,仅在处理器遇到IO边界时无需保证执行顺序。
尝试多种方案后均陷入困境:要么可能导致消息无法被启动处理,要么调度逻辑和原问题一样,把顺序控制权交给了asyncio.Task。
内容的提问来源于stack exchange,提问作者user48956
相关产品推荐
相关产品推荐

