【发布时间】:2023-03-25 01:30:01
【问题描述】:
我有以下用例,我很难确定正确的并发模式。
我有一项服务,其中包含要执行的计算任务列表:
- 有些执行速度很快(几秒钟),有些可能需要几个小时
- 我从不希望同一任务同时执行两次
- 不同的任务可以并行执行
- 如果一个任务应该每小时刷新一次,但在某些时候,它需要超过 1 小时才能执行,我想放弃新的执行但将其记录在某个地方
- 我想让任务超时
当然,我可以使用外部库。
我查看了singleflight,但这似乎是针对缓存,并且任务的新执行将被阻止,直到该任务完成计算。就我而言,我想记录它已经在计算但丢弃新执行的事实(或者只是不执行)。
【问题讨论】:
-
太棒了!这很有意义,非常感谢!
-
@Mike:goroutine 必须告诉其他人它已经完成了。这通常使用 WaitGroup 或通道之类的东西来完成。
-
如果您继续添加您的答案,我会接受!
标签: go concurrency