Maison >développement back-end >Golang >Le garbage collector de Go supprime les sockets ZeroMQ lorsqu'il est utilisé
Je développe un système distribué utilisant Zeromq and Go. C'est comme un registre distribué, vous pouvez donc prendre du contenu et y ajouter des éléments. J'ai des clients qui font automatiquement des demandes d'obtention et d'ajout. Le programme fonctionne correctement pendant quelques secondes, mais plante ensuite avec l'erreur "panique : opération de socket sur un non-socket".
J'ai essayé de désactiver le garbage collector en utilisant debug.setgcpercent(-1), mais je suis sûr que cette solution n'est pas tout à fait correcte. C'est le code d'initialisation du serveur
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, } }
C'est la fonction qui contrôle le serveur
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) } }
L'intégralité du code est dans mon github
Si quelqu'un sait pourquoi cela se produit, vous sauvegarderez mon article. Merci
La question est que j'utilise Receive_socket zmq.Socket
声明了 receive_socket,而它本应是 *Receive_socket zmq.Socket
. Le pointeur n'est qu'une copie et est donc considéré comme un déchet par le GC.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!