Golang超时或提早返回

时间:2018-12-16 22:05:16

标签: go websocket

我正在尝试使用websockets作为学习项目在Golang中构建实时多人游戏服务器,但我难以理解应该如何确切地实现这个概念:

给游戏室中的所有用户一个持续时间MAX_TIMEOUT来响应提供的提示。响应是通过websocket连接提交的。如果所有用户在MAX_TIMEOUT之前做出响应,则Action A应该使用响应来进行。如果MAX_TIMEOUT在提交所有提示之前已经过去,那么Action B应该会发生,并使用可用的响应。

来自Node.JS,我可以看到自己使用Promises实现了这一点,但是在Golang中,我很迷路。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

结帐gorilla/websocket's chat example。如上所述,它使用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

答案 1 :(得分:2)

此示例应使您更好地了解如何实现超时。您需要使用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