Go语言的垃圾收集器正在删除使用中的ZeroMQ套接字

u4vypkhs  于 2023-01-28  发布在  Go
关注(0)|答案(1)|浏览(118)

我正在使用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 here
如果有人知道为什么会发生这种情况,你会保存我的论文。谢谢

4xrmg8kj

4xrmg8kj1#

问题是我用Receive_socket zmq.Socket声明了receive_socket,而它应该是*Receive_socket zmq.Socket,指针只是一个副本,因此被GC视为垃圾。

相关问题