You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go垃圾回收误删在用ZeroMQ套接字致程序崩溃求助

问题排查:ZeroMQ "socket operation on non-socket" 崩溃问题

我正在使用Go和ZeroMQ开发一款类似分布式账本的分布式系统,支持内容查询与追加操作。配置自动客户端发送GET和ADD请求后,程序运行数秒即崩溃,抛出错误:

panic: socket operation on non-socket

我尝试通过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仓库:Loukas Papalazarou的Thesis仓库下的BFT-Distributed-G-Set-Local目录。

恳请各位帮忙排查问题原因,这对我的毕业论文至关重要,感谢支持!

内容的提问来源于stack exchange,提问作者Loukas Papalazarou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:00:59