gpt4 book ai didi

Go Channel读写卡死循环

转载 作者:IT王子 更新时间:2023-10-29 02:23:02 25 4
gpt4 key购买 nike

首先,我想做一个长轮询通知系统。更具体地说,我将发出 http 请求,只有当 map channel 为 true 时才会返回响应。

这是我使用的代码块:

var MessageNotification = make(map[string]chan bool, 10)

func GetNotification(id int, timestamp int) notification {
<-MessageNotification["1"]

var chat_services []*models.Chat_service
o := orm.NewOrm()

_, err := o.QueryTable("chat_service").Filter("Sender__id", id).RelatedSel().All(&chat_services)

if err != nil {
return notification{Status: false}
}
return notification{Status: true, MessageList: chat_services}
}

func SetNotification(id int) {
MessageNotification[strconv.Itoa(id)] <- true
}

这是 Controller block :

func (c *ChatController) Notification() {

data := chat.GetNotification(1,0)

c.Data["json"] = data
c.ServeJSON()

}


func (c *ChatController) Websocket(){


chat.SetNotification(1)

c.Data["json"] = "test"
c.ServeJSON();

}

为测试创建的函数名称和变量。

没有发生错误。感谢您的帮助。

最佳答案

您不是在创建 channel 。

var MessageNotification = make(map[string]chan bool, 10)

这条线制作了一个容量为 10 的 map ,但您并未在 map 中创建实际的 channel 。结果,`SetNotification["1"] 是一个 nil channel ,并且在 nil channel 上发送和接收无限期阻塞。

你需要输入

MessageNotification["1"] = make(chan bool)

如果需要,您可以包含一个大小(我有预感您在 map 制作中的“10”应该是该 channel 的缓冲)。这甚至可以有条件地完成:

func GetNotification(id int, timestamp int) notification {
if _, ok := MessageNotification["1"]; !ok { // if map does not contain that key
MessageNotification["1"] = make(chan bool, 10)
}

<-MessageNotification["1"]
// ...
}

func SetNotification(id int) {
if _, ok := MessageNotification[strconv.Itoa(id)]; !ok { // if map does not contain that key
MessageNotification[strconv.Itoa(id)] = make(chan bool, 10)
}

MessageNotification[strconv.Itoa(id)] <- true
}

这样,尝试访问 channel 的第一个位置将其添加到 map 并正确创建 channel ,因此在其上发送和接收将实际起作用。

关于Go Channel读写卡死循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38586804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com