Go 的垃圾收集器在使用时删除 ZeroMQ 套接字
短信预约 -IT技能 免费直播动态提醒
问题内容
我正在使用 zeromq 和 go 开发一个分布式系统。它就像一个分布式账本,因此您可以获取内容并追加。我有自动发出 get 和 add 请求的客户端。该程序运行良好几秒钟,但随后崩溃,并出现错误“panic:非套接字上的套接字操作”。
我尝试使用 debug.setgcpercent(-1) 关闭垃圾收集器,但我确信这个解决方案并不完全正确。 这是服务器初始化代码
package server
import (
"backend/config"
"backend/gset"
"backend/tools"
zmq "github.com/pebbe/zmq4"
)
type server struct {
zctx *zmq.context
peers map[string]*zmq.socket
receive_socket zmq.socket
id string
gset map[string]string
port string
my_init map[string]bool
my_echo map[string]bool
my_vote map[string]bool
peers_echo map[string]bool
peers_vote map[string]bool
}
func createserver(node config.node, peers []config.node, zctx *zmq.context) *server {
id := node.host + node.port
port := node.port
server_sockets := make(map[string]*zmq.socket)
my_gset := gset.create()
my_init := make(map[string]bool)
my_echo := make(map[string]bool)
my_vote := make(map[string]bool)
peers_echo := make(map[string]bool)
peers_vote := make(map[string]bool)
receive_socket, _ := zctx.newsocket(zmq.router)
receive_socket.bind("tcp://*:" + node.port)
tools.log(id, "bound tcp://*:"+node.port)
// connect my dealer sockets to all other servers' router
for i := 0; i < len(peers); i++ {
s, _ := zctx.newsocket(zmq.dealer)
s.setidentity(id)
s.connect("tcp://localhost:" + peers[i].port)
// append socket to socket list
server_sockets["tcp://localhost:"+peers[i].port] = s
}
return &server{
peers: server_sockets,
receive_socket: *receive_socket,
id: id,
port: port,
gset: my_gset,
my_init: my_init,
my_echo: my_echo,
my_vote: my_vote,
peers_echo: peers_echo,
peers_vote: peers_vote,
}
}
这是控制服务器的函数
func Normal_listener_task(s *server.Server) {
for {
message, err := s.Receive_socket.RecvMessage(0)
if err != nil {
fmt.Println(zmq.AsErrno(err))
panic(err)
}
messaging.HandleMessage(s, message)
}
}
整个代码在我的 github 中
如果有人知道为什么会发生这种情况,你就会保存我的论文。谢谢
正确答案
问题是我用 Receive_socket zmq.Socket
声明了 receive_socket,而它本应是 *Receive_socket zmq.Socket
。该指针只是一个副本,因此被 GC 视为垃圾。
以上就是Go 的垃圾收集器在使用时删除 ZeroMQ 套接字的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
Go 的垃圾收集器在使用时删除 ZeroMQ 套接字
下载Word文档到电脑,方便收藏和打印~
下载Word文档
猜你喜欢
Go 的垃圾收集器在使用时删除 ZeroMQ 套接字
问题内容我正在使用 zeromq 和 go 开发一个分布式系统。它就像一个分布式账本,因此您可以获取内容并追加。我有自动发出 get 和 add 请求的客户端。该程序运行良好几秒钟,但随后崩溃,并出现错误“panic:非套接字上的套接字操
2024-02-05