我正在使用 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中文網其他相關文章!