在下面的用例中,我很难识别正确的并发模式。
我有一个服务,它有一个要执行的计算任务列表:
当然,我不介意使用外部库。
我看过singleflight,但这似乎是针对缓存的,在此任务完成计算之前,任务的新执行将被阻止。在我的例子中,我想记录它已经在计算的事实,但放弃新的执行(或者干脆不执行)。
发布于 2021-02-02 17:41:34
维护正在进行的任务地图。添加任务时,检查map并记录任务是否正在进行;将任务添加到映射中。完成后,从地图中删除任务。
下面是一个假设任务由string标识并由func()实现的示例。
var (
mu sync.Mutex
inProgress = map[string]bool{}
)
func startTask(id string, fn func()) {
mu.Lock()
ip := inProgress[id]
if !ip {
inProgress[id] = true
}
mu.Unlock()
if ip {
log.Printf("task %s in progress", id)
} else {
go func() {
fn()
mu.Lock()
delete(inProgress, id)
mu.Unlock()
}()
}
}https://stackoverflow.com/questions/66014070
复制相似问题