Go Channel读写卡死循环
Go Channel reading and writing stuck in infinite loop
首先,我想做一个Long Polling通知系统。具体来说,我会发起http请求,只有map channel为true
.
才会返回response
这是我使用的代码块:
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
}
这是控制器块:
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();
}
为测试创建的函数名称和变量。
没有发生错误。感谢您的帮助。
您没有创建自己的频道。
var MessageNotification = make(map[string]chan bool, 10)
此行创建了一个容量为 10 的地图,但您并未在地图中创建实际的 channels。结果,`SetNotification["1"] 是一个 nil 通道,并且在 nil 通道上发送和接收无限期阻塞。
你需要输入
MessageNotification["1"] = make(chan bool)
如果需要,您可以包括一个大小(我有一种预感,您在地图制作中的“10”应该是该频道的缓冲)。这甚至可以有条件地完成:
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
}
这样,尝试访问频道的第一个位置会将其添加到地图并正确创建频道,因此在其上发送和接收将真正起作用。
首先,我想做一个Long Polling通知系统。具体来说,我会发起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
}
这是控制器块:
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();
}
为测试创建的函数名称和变量。
没有发生错误。感谢您的帮助。
您没有创建自己的频道。
var MessageNotification = make(map[string]chan bool, 10)
此行创建了一个容量为 10 的地图,但您并未在地图中创建实际的 channels。结果,`SetNotification["1"] 是一个 nil 通道,并且在 nil 通道上发送和接收无限期阻塞。
你需要输入
MessageNotification["1"] = make(chan bool)
如果需要,您可以包括一个大小(我有一种预感,您在地图制作中的“10”应该是该频道的缓冲)。这甚至可以有条件地完成:
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
}
这样,尝试访问频道的第一个位置会将其添加到地图并正确创建频道,因此在其上发送和接收将真正起作用。