【发布时间】:2020-07-02 05:30:43
【问题描述】:
我看到了大量关于如何定期运行函数的问题。 问题?他们都锁定程序无法继续运行。
我需要什么?
我有一个 websocket,我有一个 for {},它一直在读取 msg,现在每 10 秒我需要运行一次对 heartbeat 函数的调用,而不会中断程序或停止阅读聊天。
我正在考虑使用一些方法,但使用渠道似乎都不干净/不错,但我认为更有经验的人可能对此有更好更简单的方法。
我正在使用类似的东西,但它永远不会到达函数的末尾以返回程序继续运行所需的内容。
timerCh := time.Tick(time.Duration(10) * time.Second)
for range timerCh {
go Heartbeat(ws)
}
return ws
我正在寻找一种能够每 10 秒调用一次 Heartbeat 的方法:
- 每次读取传入的 websocket 连接时都会重复调用它
- 不锁定程序。
一些上下文, 这是一个桥接聊天,所以我打开一个 websocket,继续阅读这个,只有在聊天消息时才发送到另一个聊天,同时我需要发送一个心跳而不锁定这个。 我现在有什么? 现在一切正常,但大约 30 秒后我的 websocket 关闭:
2020/07/01 20:59:09 Error read: websocket: close 1000 (normal)
【问题讨论】:
-
为什么不把for循环放到goroutine中呢?
-
从 websocket 读取的那个?因为它会连续进行Hearbeat(ws),我不希望这样,每10秒左右一次。如果我添加一个 timer.Tick 然后停止主 goroutine...
-
这不是您使用自动收报机的原因吗,它只运行一次,每 10 秒运行一次?你也应该有一些方法来取消它(另外你不应该使用
time.Tick,因为正如文档所述,你不能关闭它) -
嗯,也许这就是问题所在,我是新手,你能给我一个不会锁定我程序其余部分的例子吗?谢谢
标签: linux go websocket gorilla heartbeat