如何在不同的Goroutines中的ZeroMQ上下文之间进行通信?

时间:2012-10-10 13:32:51

标签: tcp go ipc zeromq inproc

我使用this as boilerplate,除了在同一个程序中我还有一些goroutine是工作者并连接到后端端点,tcp://127.0.0.1:5560。

我想要做的是让它通过更有效的方式连接,例如ipc://,inproc://,甚至是unix套接字。我试过那些,但它没有用。对于ZeroMQ,频道是不合适的吗?

那么如何在没有tcp的情况下将不同的goroutine连接到ZeroMQ上下文?还有更好的选择吗?

更新: 代码:

// 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…
}

1 个答案:

答案 0 :(得分:5)

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

此外,如果您使用相同的Context,则ZMQ不需要任何后端I / O线程

您没有提到您正在运行的操作系统,但ipc://传输仅在大多数* nix下可用。在Windows下,您只能拥有以下传输:tcp://,inproc://,pgm://。有关详细信息,请查看zmq_connect文档。