Исходя из вопроса и других комментариев ОП, похоже, что цель состоит в том, чтобы начать новую работу, если и только если она еще не запущена.
Использовать логическую переменную, защищенную sync.Mutex для записи текущего состояния задания.Установите для переменной значение true при запуске задания и значение false, когда задание завершено.Протестируйте эту переменную, чтобы определить, следует ли запускать задание.
var (
jobIsRunning bool
JobIsrunningMu sync.Mutex
)
func maybeStartJob() {
JobIsrunningMu.Lock()
start := !jobIsRunning
jobIsRunning = true
JobIsrunningMu.Unlock()
if start {
go func() {
theJob()
JobIsrunningMu.Lock()
jobIsRunning = false
JobIsrunningMu.Unlock()
}()
}
}
func main() {
maybeStartJob()
maybeStartJob()
maybeStartJob()
}
Можно также использовать низкоуровневый пакет sync / atomic , который может иметь более высокую производительность, чем мьютекс.
var jobIsRunning uint32
func maybeStartJob() {
if atomic.CompareAndSwapUint32(&jobIsRunning, 0, 1) {
go func() {
theJob()
atomic.StoreUint32(&jobIsRunning, 0)
}()
}
}
Документация пакета sync / atomic предупреждает, что функции в пакете требуют большой осторожности для правильного использования и что большинство приложений должны использовать пакет синхронизации.