Tcp 如何在不同goroutine中的ZeroMQ上下文之间通信?

Tcp 如何在不同goroutine中的ZeroMQ上下文之间通信?,tcp,go,ipc,zeromq,inproc,Tcp,Go,Ipc,Zeromq,Inproc,我正在使用,除了在同一个程序中,我还有一些goroutine,它们是worker并连接到后端端点,tcp://127.0.0.1:5560. 我想做的是让它通过更有效的方式连接,例如ipc://、inproc://,甚至unix套接字。我试过了,但没用。频道是ZeroMQ的禁区,对吗 那么,在没有tcp的情况下,如何使用ZeroMQ上下文连接不同的goroutine呢?有更好的选择吗 更新: 守则: // Simple message queuing broker // Same as requ

我正在使用,除了在同一个程序中,我还有一些goroutine,它们是worker并连接到后端端点,tcp://127.0.0.1:5560.

我想做的是让它通过更有效的方式连接,例如ipc://、inproc://,甚至unix套接字。我试过了,但没用。频道是ZeroMQ的禁区,对吗

那么,在没有tcp的情况下,如何使用ZeroMQ上下文连接不同的goroutine呢?有更好的选择吗

更新: 守则:

// Simple message queuing broker
// Same as request-reply broker but using QUEUE device
//
// Author:  Brendan Mc.
// Requires: http://github.com/alecthomas/gozmq

package main

import (
    zmq "github.com/alecthomas/gozmq"
)

func startWorker() {
    context, _ := zmq.NewContext()
    defer context.Close()

    worker, _ := context.NewSocket(zmq.REP)
    //err := worker.Connect("ipc:///backend")  // Tried it, but nothing
    //err := worker.Connect("inproc:///backend")  // Tried it, but nothing
    err := worker.Connect("tcp://127.0.0.1:5560") // this works
    if err != nil {
        fmt.Println(err)
    }

    for {
        data, err := worker.Recv(0)
        fmt.Println(string(data))
        worker.Send([]byte("I got your data"), 0)
    }
}

func main() {
    context, _ := zmq.NewContext()
    defer context.Close()

    // Socket facing clients
    frontend, _ := context.NewSocket(zmq.ROUTER)
    defer frontend.Close()
    frontend.Bind("tcp://*:5559")

    // Socket facing services
    backend, _ := context.NewSocket(zmq.DEALER)
    defer backend.Close()
    //backend.Bind("ipc:///backend")  // Tried it, but nothing
    //backend.Bind("inproc:///backend")  // Tried it, but nothing
    backend.Bind("tcp://*:5560") // this works

    for i := 0; i < 4; i++ {
        go startWorker() // Start workers in a separate goroutine
    }

    // Start built-in device
    zmq.Device(zmq.QUEUE, frontend, backend)

    // We never get here…
}
//简单消息队列代理
//与请求-应答代理相同,但使用队列设备
//
//作者:Brendan Mc。
//要求:http://github.com/alecthomas/gozmq
包干管
进口(
zmq“github.com/alecthomas/gozmq”
)
func startWorker(){
context,q:=zmq.NewContext()
延迟上下文。关闭()
worker,quot:=context.NewSocket(zmq.REP)
//错误:=工作者。连接(“ipc:///backend我试过了,但什么也没有
//错误:=工作者。连接(“inproc:///backend我试过了,但什么也没有
错误:=工作者。连接(“tcp://127.0.0.1:5560这很管用
如果错误!=零{
fmt.Println(错误)
}
为了{
数据,错误:=worker.Recv(0)
fmt.Println(字符串(数据))
worker.Send([]字节(“我得到了您的数据”),0)
}
}
func main(){
context,q:=zmq.NewContext()
延迟上下文。关闭()
//面向套接字的客户端
前端,:=context.NewSocket(zmq.ROUTER)
延迟前端。关闭()
前端绑定(“tcp://*:5559”)
//面向套接字的服务
后端,\:=context.NewSocket(zmq.DEALER)
延迟后端。关闭()
//backend.Bind(“ipc:///backend我试过了,但什么也没有
//backend.Bind(“inproc:///backend我试过了,但什么也没有
Bind(“tcp://*:5560”)//这很有效
对于i:=0;i<4;i++{
go startWorker()//在单独的goroutine中启动工作进程
}
//启动内置设备
zmq.Device(zmq.QUEUE、前端、后端)
//我们从来没有到过这里…
}

为了使用
inproc://
传输,所有套接字需要共享相同的上下文(这是线程安全的)

此外,如果您使用的是相同的上下文,那么ZMQ不需要任何后端I/O线程


您没有提到在哪个操作系统下运行,但是
ipc://
传输仅在most*nix下可用。在windows下,您只能使用以下传输:tcp://、inproc://、pgm://。查看文档以了解更多信息。

我不太确定您的问题是什么?您想知道是否可以将其他协议与0MQ一起使用吗?或者你在问从多个goroutine使用0MQ是否安全?我在问我是否可以使用不同的协议与0MQ,在goroutine之间进行通信。我可以通过tcp在goroutines之间进行通信,但不能使用inproc或ipc。这些在Go的goroutines下也可以工作吗?发布一些代码,使用zmq有无数的小事情可能会导致一些问题。。。一般使用ZMQ时,只要所有内容都在同一进程内,就应该能够使用
inproc://
连接。每个goroutine都需要“共享”相同的上下文(上下文是线程安全的)并从中创建每个inproc://连接。添加了代码后,我认为问题(以及这个问题的答案)在于,由于goroutine不共享相同的上下文,它们无法通过inproc:///连接。这是对的@G19Fantaic?ipc://或unix套接字呢?为什么不使用这些?为什么您希望使用0mq在Goroutine之间进行通信?为什么不直接使用频道呢?