oWart
@oWart
Инженер-конструктор

Как в Go правильно организовать циклическое событие по таймеру?

Только начинаю свое знакомство с Go. В качестве обучения решил написал websocket сервер для js игры. Необходимо организовать циклическое событие каждые 50мс для обработки передвижений и отправки новых координат клиентам. Пытаюсь запустить горутину, которая будет ждать события таймера:

func main() {
	go worker(time.NewTicker(50 * time.Millisecond))
	for {
	}
}

func worker(ticker *time.Ticker) {
	var lastUpdate = time.Now()
	var timeSince int64
	for range ticker.C {
		timeSince = time.Since(lastUpdate).Nanoseconds() / 1000000
		fmt.Println("Time to work ", timeSince)
		lastUpdate = time.Now()
	}
}

Лог сообщений
Time to work 50
Time to work 50
Time to work 50
Time to work 55
Time to work 56
Time to work 64
Time to work 54
Time to work 31
Time to work 23
Time to work 86
Time to work 42
Time to work 39
Time to work 1
Time to work 0
Time to work 0
Time to work 0
Time to work 38
Time to work 63
Time to work 0
Time to work 81
Time to work 0
Time to work 0
Time to work 0
Time to work 105
Time to work 0
Time to work 5
Time to work 34
Time to work 5
Time to work 4
Time to work 91
Time to work 0
Time to work 0
Time to work 32
Time to work 41
Time to work 48

Но на выходе столкнулся с тем, что интервалы далеко не одинаковые, более того есть с нулевым временем. А ведь это всего одна горутина, а впереди еще куча воркеров приема-отправки данных через вебсокеты...

Происходит такое в моменты минимальной нагрузки компа (движения мышки, открытие папки и т.д), работаю под виндой.

Я конечно понимаю, что горутины работают на магии рантайма, но чтоб результат был настолько плохим... Я уверен, что я что-то делаю неправильно. Я добился результата немного получше, когда обрабатывал таймер в основном цикле программы, но и там все далеко не идеально.

Короче, можно ли на Go сделать что-то внятное в плане realtime игрового сервера?
Изначально ковырял Node.JS, там такого не замечал.
  • Вопрос задан
  • 1443 просмотра
Решения вопроса 1
Вы загружаете процессор на максимум бесполезным циклом
for {
}


Замените его на бесконечное ожидание, например
select {
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы