Rumah >pembangunan bahagian belakang >Golang >Pengumpul sampah Go memadam soket ZeroMQ apabila digunakan
Saya sedang membangunkan sistem teragih menggunakan zeromq and go. Ia seperti lejar yang diedarkan, jadi anda boleh mengambil kandungan dan menambahnya. Saya mempunyai pelanggan yang membuat permintaan dapatkan dan tambah secara automatik. Program ini berjalan dengan baik selama beberapa saat, tetapi kemudian ranap dengan ralat "panik: Operasi soket pada bukan soket".
Saya cuba mematikan pemungut sampah menggunakan debug.setgcpercent(-1), tetapi saya pasti penyelesaian ini tidak betul sepenuhnya. Ini ialah kod permulaan pelayan
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, } }
Ini adalah fungsi yang mengawal pelayan
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) } }
Keseluruhan kod ada dalam github saya
Jika sesiapa tahu mengapa ini berlaku, anda akan menyimpan kertas saya. Terima kasih
Soalannya saya guna Receive_socket zmq.Socket
声明了 receive_socket,而它本应是 *Receive_socket zmq.Socket
. Penunjuk hanyalah salinan dan oleh itu dianggap sampah oleh GC.
Atas ialah kandungan terperinci Pengumpul sampah Go memadam soket ZeroMQ apabila digunakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!