繁体   English   中英

Go 的垃圾收集器在使用时删除 ZeroMQ sockets

[英]Go's garbage collector is deleting ZeroMQ sockets when in use

提示:本站为国内最大中英文翻译问答网站,提供中英文对照查看,鼠标放在中文字句上可显示英文原文

我正在开发一个分布式系统 uisng ZeroMQ 和 Go。它就像一个分布式分类帐,所以你可以获得联系方式和 append。我有自动客户端发出 GET 和 ADD 请求。 该程序可以正常运行几秒钟,但随后会因错误“恐慌:非套接字上的套接字操作”而崩溃。

我尝试使用 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,
    }
}

这是控制服务器的 function

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 zmq.Socket 时,我用Receive_socket zmq.Socket声明了 receive_socket 。 该指针只是一个副本,因此被 GC 视为垃圾。

问题未解决?试试搜索: Go 的垃圾收集器在使用时删除 ZeroMQ sockets
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM