python - Python,多线程工作队列:当工作人员可能等待其他工作人员完成时,避免死锁的正确设计是什么?
问题描述
我有一个典型的场景,我有有限数量的线程/工作者,它们永远从队列中获取和处理任务。这些任务是典型的读取 > 处理 > 保存。事实证明,其中一些任务本身可以添加到任务队列中,并在释放之前等待它们提供的任务完成(典型的 .join() 操作)。
在这种情况下,我们很可能会陷入死锁,其中有限数量的工人都被分配并忙于自己等待其他任务完成的任务 - 但是没有工人离开,他们永远不会这样做,我们就是死锁。例如,有 5 个工作人员可用,他们立即拉取 5 个任务,再触发 15 个任务并等待它们完成 - 因为只有 5 个可用工作人员被阻止,所以它们永远不会完成。
显然,如果有足够的工人,这种情况不太可能发生,但这并不是很令人满意(我们很可能有 200 名工人每人轮询 20 个新任务)。我想到了一些解决方法——但没有一个看起来很优雅
- 我可以为那些不依赖于其他任务的辅助任务创建一个单独的队列/工作池(或者让每个工作人员在需要时创建自己的单独队列/工作池)
- 我可以使任务非阻塞(部分将结果保存到数据库,另一个完成结果,但数据库处于不稳定状态听起来不太好)
对这种场景的正确设计有任何想法吗?
解决方案
推荐阅读
- nginx - 如何以 DRY 方式在包含共享路径的 2 个应用程序之间进行代理
- spring-boot - Pivotal Cloud Foundry - 由于 java netsocket(port) 权限被拒绝,部署的 Spring Boot 应用程序无法运行
- firebase - Flutter firebase_database - DatabaseReference runTransaction - 同时交易 - 两者都通过
- powershell - 为什么字符串显示长度为 1?
- r - R - 基于来自另一列的部分字符串匹配添加新列
- sql - 从日期范围生成销售事实数据
- r - 基于条件 R 的观测子集问题
- typescript - 打字稿 - 创建新类型,不包括“从不”类型的道具
- authentication - Vertx Sockjs Eventbus 处理程序授权
- node.js - 将 React 连接到两个单独的服务器