@kinojs
Начинающий разрабочтик, WEB

Как сделать в Go, чтобы какая-то goroutine выполнялась циклично до тех пор, пока state не станет false?

Я попытался написать что-то подобное, но мне кажется, что это не будет работать всегда правильно. Подскажите, пожалуйста, как такое можно сделать без глобальных переменных? Чисто, чтоб функция была сама по себе.

func doSomethingEvery5Seconds(ch chan bool) {
	log.Println("Started!")
	for <-ch {
		log.Println("I am doing this!")
		time.Sleep(5 * time.Second)
		ch <- true
	}
}

func main() {
  ch := make(chan bool, 1)
  ch <- true
  go doSomethingEvery5Seconds(ch)
  time.Sleep(15 * time.Second)
  ch <- false // Останавливаем спустя 15 секунд
}
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
EvgenyMamonov
@EvgenyMamonov
Senior software developer, system architect
В вашей реализации надпись "I am doing this!" будет показана только один раз, т.к. вы пишите всего 1 раз в канал, а потом выполнение заблокируется на чтении данных из канала, т.к. там данных не будет.

То, что вы хотите сделать можно сделать вот так:
package main

import (
    "log"
    "time"
)

func doSomethingEvery5Seconds(ch chan bool) {
    log.Println("Started!")
    for {
        select {
        case <-ch:
            break
        default:
            log.Println("I am doing this!")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    ch := make(chan bool, 1)
    go doSomethingEvery5Seconds(ch)
    time.Sleep(15 * time.Second)
    close(ch) // Останавливаем спустя 15 секунд
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
romesses
@romesses
Backend инженер
Вот пример работы с маятником:
https://gobyexample.com/tickers
Похоже на то как указал Евгений Мамонов , но вместо time.Sleep(1 * time.Second) значения берутся из канала маятника, которые будут блокироваться на указанное время.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Ovision Санкт-Петербург
от 100 000 до 300 000 ₽
ELMA Санкт-Петербург
от 80 000 до 180 000 ₽