首頁  >  文章  >  後端開發  >  Go 的垃圾收集器在使用時刪除 ZeroMQ 套接字

Go 的垃圾收集器在使用時刪除 ZeroMQ 套接字

WBOY
WBOY轉載
2024-02-05 21:30:08962瀏覽

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

問題內容

我正在使用 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 中

如果有人知道為什麼會發生這種情況,你就會保存我的論文。謝謝


正確答案


問題是我用Receive_socket zmq.Socket 宣告了receive_socket,而它本來應該是*Receive_socket zmq .Socket。該指標只是一個副本,因此被 GC 視為垃圾。

以上是Go 的垃圾收集器在使用時刪除 ZeroMQ 套接字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除