Maison  >  Article  >  développement back-end  >  Le garbage collector de Go supprime les sockets ZeroMQ lorsqu'il est utilisé

Le garbage collector de Go supprime les sockets ZeroMQ lorsqu'il est utilisé

WBOY
WBOYavant
2024-02-05 21:30:08962parcourir

Go 的垃圾收集器在使用时删除 ZeroMQ 套接字

Contenu de la question

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


Bonne réponse


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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer