asyncio、任务协作与有界并发
Python 性能优化与高并发#Python全栈#第二十一阶段#Python 性能优化与高并发#asyncio、任务协作与有界并发约 914 字 · 3 分钟阅读
追问显示点击任意追问卡片可收起 / 展开
把接口写成 async def,是否就能提高并发能力?
追问 协程真正让出执行机会需要什么条件?同步数据库访问、阻塞 HTTP 和长时间纯 Python 计算分别会怎样影响事件循环?
怎样判断事件循环被阻塞了?
追问 无关请求同时变慢、定时任务延迟与慢回调分别提供什么线索?怎样结合调试信息和调用栈找到阻塞位置?
把同步调用移到线程池时,需要考虑哪些限制?
追问 线程数、排队数量、调用方超时与线程中的任务继续运行怎样处理?数据库驱动、客户端或业务对象的线程安全需要怎样核对?
gather 与 TaskGroup 在组织并发任务时,有哪些需要核对的行为?
追问 子任务异常、其他任务是否继续、异常如何传递和资源如何清理分别怎样影响业务?怎样验证所用方式在不同失败路径下的实际行为?
为什么限制同时执行的任务数,还不一定限制了内存?
追问 为百万条输入提前创建任务,即使任务内部用了 Semaphore,也可能保留哪些对象?怎样使用逐步生产和有限消费者控制待处理规模?
怎样用有界队列连接生产者与消费者?
追问 队列满时生产者等待有什么作用?结束信号、task_done、join、异常退出与取消怎样协调,避免永久等待或遗漏任务?
怎样给一个并发聚合接口设置总体截止时间?
追问 等待并发名额、请求上游、处理结果和重试是否都计入预算?部分子任务超时后,怎样决定返回部分结果、整体失败或继续后台处理?
协程取消为什么不等于业务操作已经撤销?
追问 正在执行的线程、远端请求或已经提交的写入还能继续吗?怎样释放本地资源、传播取消,并根据业务状态判断是否允许重试?
并发协程可以共享一个数据库 Session 吗?
追问 事务状态与会话对象的可变状态有什么风险?怎样区别共享连接池、复用会话工厂与多个任务共用同一个会话实例?
并发请求很多,但实际运行很少时,应怎样排查?
追问 应用并发限制、HTTP 连接池、数据库连接池与上游限流可能怎样叠加?在哪些位置计时,才能识别真正的等待队列?
异步行为核对资料: Python:Coroutines and Tasks、asyncio 开发注意事项、SQLAlchemy:AsyncSession 的并发使用。涉及 TaskGroup 等功能时,说明所用 Python 版本。