我有一个任务队列,并且有多个工作人员。 为了实现并发性,工作人员在获取并执行一项任务时将锁定标志插入任务。
但这是一个问题。 如果某个工人在锁定任务时死亡或挂起,则该任务将永远不会执行。 我真的很烦。
谁能解决这个问题?
答案 0 :(得分:1)
一旦某个任务将被锁定到某个工作程序,则必须使用一些逻辑为该任务添加一个唯一的标识号,该编号描述了其自身及其当前工作程序。
然后,您需要以循环方式对每个工作人员进行一些轮询,即worker 2
对worker 1
进行轮询,worker 3
对worker 2
和worker 1
进行轮询在worker 3
上进行轮询。
因此,当worker 1
发生故障时,worker 2
会在轮询过程中理解并抓住worker 1
的任务。您还需要维护一个manager worker
,它负责分配和维护一个映射到其各自工作人员的任务表。
这只是基本想法。您还需要注意以下事项:
manager worker
掉线了怎么办?在这里,您必须使用token ring
方法,即持有令牌的工作人员是经理。 manager worker
死后,必须使用election algorithm
向现有工作人员分配新令牌。
答案 1 :(得分:1)
在工作人员执行的任务框架合理的情况下,基于临时锁定的想法,最好使用软互斥锁。
表示如果任务完成大约需要60秒,那么该工作者将锁定该任务一段安全的时间(例如10分钟)。 请求(并锁定)锁的时间将保存为锁的一部分。
工作者每次请求锁定任务时,都会检查: 如果现在的时间晚于上次锁定的时间10分钟,则工作人员将“窃取”该锁定并将其更新为现在的时间。
这创建了一种机制,可以杀死工人,但不能永远锁定任务。