我是 Go 编程的新手,我尝试为多人游戏构建 API。如果我对 http://localhost:8080/create_game/gameName 发出 GET 请求.自动收报机完成后服务器对请求的响应。我需要立即从服务器获得响应,但是当自动收报机结束并且游戏超时并被删除时我得到了它。
这是我的代码:
var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan Game)
//GAME_TIMEOUT in seconds
const GAME_TIMEOUT = 20
//ID generating
var genID = 0
var games = []Game{}
var msg json.RawMessage
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
type GameToSend struct {
Type string `json:"type"`
ID int `json:"id"`
Name string `json:"name"`
}
type Game struct {
ID int `json:"id"`
Name string `json:"name"`
Timer <-chan time.Time `json:"timestamp"`
}
func main() {
router := mux.NewRouter()
router.HandleFunc("/create_game/{name}", createGame)
router.HandleFunc("/game_events", handleConnections)
http.ListenAndServe(":8080", router)
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
clients[conn] = true
for _, game := range games {
conn.WriteJSON(GameToSend{"game.created", game.ID, game.Name})
}
for {
err := conn.ReadJSON(&msg)
if err != nil {
fmt.Println(err)
} else {
fmt.Println(msg)
}
}
}
func broadcastGame(game GameToSend) {
for conn := range clients {
conn.WriteJSON(game)
}
}
func createGame(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
genID++
game := Game{genID, params["name"], time.NewTimer(GAME_TIMEOUT * time.Second).C}
games = append(games, game)
broadcastGame(GameToSend{"game.created", game.ID, game.Name})
w.Write([]byte("response"))
checkTimeout(genID)
}
func deleteGame(actionType string, i int) {
for index, game := range games {
if game.ID == i {
broadcastGame(GameToSend{actionType, games[index].ID, games[index].Name})
games = games[:index+copy(games[index:], games[index+1:])]
}
}
}
func checkTimeout(id int) {
for _, game := range games {
if game.ID == id {
<-game.Timer
deleteGame("game.timeout", id)
}
}
}
知道如何解决吗?
最佳答案
您可以更改很多东西,但其中之一是通常不要在响应客户端的代码中运行可能长时间运行的任务。假设您有数百万个游戏,数量如此之多以至于每次调用 checkTimeout 都需要一秒钟来遍历所有游戏。每个请求都会有一秒钟的延迟才能得到完整的响应,这不是很好。最好指示另一个 goroutine 应该迭代游戏并清理过期的游戏,这样您就可以在后台进行清理的同时立即返回客户端。
原来我误读了你在做什么,但这个建议仍然有效。在这种情况下,虽然“长时间运行的功能”实际上会等到计时器到期才返回。这可能比一秒长得多!你是想在 goroutine 中运行它吗? 去检查超时(genID)
关于api - Go 不会立即响应 GET 请求,它会在 ticker 完成后响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50290510/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h
我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path