- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
首先,我想做一个长轮询通知系统。更具体地说,我将发出 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/
我的 php/mysql 脚本有问题。它应该只输出 while 循环一次,但我得到了无限循环和无休止的页面。 $query = mysql_query("SELECT * FROM users WHE
我又来了!所以,我正在用 C++ 开发一个 GBC 模拟器,但我遇到了一些问题。首先,我在 VS10 中使用 Qt,到目前为止它运行良好。但是,我有我的 GUI(主窗口)和一些对象(QListWidg
所以这是我正在做的同一个拖放游戏项目,但是我遇到了一个无限循环问题,我想在其中使用 while(backpackLength 0) { document.getElem
我已经花了 3 个小时试图让这段代码工作,但是每当我尝试时我都会陷入循环并且控制台不断循环。我已经尝试了所有方法 - 我创建了一个只返回 i 并重新分配值的函数,但它似乎不起作用。 出于某种原因,每当
我使用 lua 接口(interface)在我的 C# 程序中获得 lua 支持,如果用户提交这样的代码,工作线程将卡住 while true do end 我有一种方法可以检测无限循环是否正在运行,
这个问题在这里已经有了答案: How does a for loop work, specifically for(;;)? (6 个答案) 关闭 7 年前。 虽然我有一些 Java 经验,但下面的
我有问题。我需要让一个程序在后台运行。该程序用于收集数据并将其保存在我的数据库中。 我开始这样做了: func main() { for { doAll() } } 一次从所有
当我在 Internet Explorer 10 中查看代码时,我收到以下错误(它不一定以标准模式呈现,由于页面的服务方式,这超出了我的控制范围)。 http://errors.angularjs.o
我在 servlet 中遇到了一些问题,每次我更改下拉菜单中的选项时,一个不同的值将传递给 servlet,然后它会导致无限循环。当我没有更改下拉列表中的选项(值没有变化)时,没有错误。 这是我的代码
iOS8 中引入了可自动调整大小的表格 View 单元格(WWDC Session 226 What's new in table and collection views)。在我的项目中,我正在尝试
我是一名优秀的程序员,十分优秀!