golang中怎样优雅的实现多个线程抢占一个任务,一个线程执行,其它等待执行完成这种模式

可以参考下groupcache中singleflight的实现
■网友
具体场景是?为什么其他失败任务要阻塞式等待第一个失败任务中的健康检查?那么只能假定之后的代码强依赖检查的结果?如果强依赖,你的代码是存在a任务失败,做完检查没问题,b任务失败,不做检查(而实际上此时做检查可能会失败哦)的竞态条件。任务和检查是两步不是原子的。个人建议根据具体场景要么就都做同步检查,要么就失败后走该走的逻辑,丢异步任务出去,在一个统一的地方做检查,并且做限制检查频率的处理。感觉这样代码清晰些。


    推荐阅读