Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengumpul sampah Go memadam soket ZeroMQ apabila digunakan

Pengumpul sampah Go memadam soket ZeroMQ apabila digunakan

WBOY
WBOYke hadapan
2024-02-05 21:30:081035semak imbas

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

Kandungan soalan

Saya sedang membangunkan sistem teragih menggunakan zeromq and go. Ia seperti lejar yang diedarkan, jadi anda boleh mengambil kandungan dan menambahnya. Saya mempunyai pelanggan yang membuat permintaan dapatkan dan tambah secara automatik. Program ini berjalan dengan baik selama beberapa saat, tetapi kemudian ranap dengan ralat "panik: Operasi soket pada bukan soket".

Saya cuba mematikan pemungut sampah menggunakan debug.setgcpercent(-1), tetapi saya pasti penyelesaian ini tidak betul sepenuhnya. Ini ialah kod permulaan pelayan

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,
    }
}

Ini adalah fungsi yang mengawal pelayan

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)
    }
}

Keseluruhan kod ada dalam github saya

Jika sesiapa tahu mengapa ini berlaku, anda akan menyimpan kertas saya. Terima kasih


Jawapan betul


Soalannya saya guna Receive_socket zmq.Socket 声明了 receive_socket,而它本应是 *Receive_socket zmq.Socket. Penunjuk hanyalah salinan dan oleh itu dianggap sampah oleh GC.

Atas ialah kandungan terperinci Pengumpul sampah Go memadam soket ZeroMQ apabila digunakan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam