Тайм-аут Голанга или возвращение рано - PullRequest
0 голосов
/ 17 декабря 2018

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

Всепользователям в игровой комнате дается MAX_TIMEOUT для ответа на предоставленное приглашение.Ответы отправляются через веб-сокеты.Если все пользователи отвечают до MAX_TIMEOUT, тогда должно произойти Action A с использованием ответов.Если MAX_TIMEOUT истекает до того, как все запросы будут отправлены, тогда Action B должно произойти, используя доступные ответы.

Исходя из Node.JS, я мог бы увидеть, как я реализую это с Promises, но в Golang,Я довольно потерян.

Любой совет?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Этот пример должен дать вам лучшее понимание того, как реализовать время ожидания.Вам нужно использовать оператор select для ожидания на каналах.Первый канал, который отвечает значением, является случаем, который выполняется.

package main

import (
    "fmt"
    "time"
)

func main() {
    maxTimeout := 2 * time.Second
    ready := make(chan bool, 1)
    go collectUserResponses(ready)

    select {
    case <-ready:
        fmt.Println("do action A")
    case <-time.After(maxTimeout):
        fmt.Println("do action B")
    }
}

func collectUserResponses(ready chan bool) {
    time.Sleep(1 * time.Second) // simulate waiting for users to respond
    ready <- true
}

https://play.golang.org/p/94jIo5tW6eG

0 голосов
/ 17 декабря 2018

Оформить заказ Пример чата гориллы / websocket .Он использует тикеры и каналы в client.go, как упомянуто выше.

Обработка запроса сервера может быть его собственной подпрограммой, выполняемой параллельно подпрограммам насоса чтения / записи.

go func() {
    for {
        for _, player := range players {
            player.Answered = false
            player.Send("prompt")
        }

        time.Sleep(time.Second * 10)

        for _, player := range players {
            if player.Answered {
               player.Send("You answered")
            } else {
               player.Send("Too slow")
            }
        }
    }
}()

// the reading routine sets `Answered` true when message received
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...