我正在使用 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 套接字的详细内容。更多信息请关注PHP中文网其他相关文章!