2012-10-10 4 views
4

Я использую this as boilerplate, за исключением того, что в той же программе у меня также есть некоторые goroutines, которые являются рабочими и подключаются к конечной точке бэкэнд, tcp: //127.0.0.1: 5560.Как общаться между контекстами ZeroMQ в разных горутинцах?

Что бы я хотел сделать, это подключить его более эффективным способом, например, ipc: //, inproc: // или даже unix-сокеты. Я пробовал это, и это не сработало. Каналы - это не-Go с ZeroMQ?

Как я могу подключить разные goroutines с контекстами ZeroMQ, без tcp? Есть ли лучшая альтернатива?

обновление: Код:

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

Я не совсем уверен, что вы спрашиваете? Вы хотите узнать, можете ли вы использовать другие протоколы с 0MQ? или Вы спрашиваете, может ли 0MQ безопасно использовать из нескольких goroutines? –

+0

Я спрашиваю, могу ли я использовать разные протоколы с 0mq, общаться между goroutines. Я могу общаться между goroutines через tcp, но я не могу сделать это с помощью inproc или ipc. Работают ли они также в гортанах Го? –

+0

Опубликуйте некоторый код, с zmq есть миллион мелочей, которые могут вызвать некоторые проблемы ... В общем случае с ZMQ вы должны иметь возможность использовать соединение 'inproc: //', пока все находится в одном процессе. Каждый goroutine должен «делиться» одним и тем же контекстом (контексты являются потокобезопасными) и создавать каждое из них inproc: // от него. – g19fanatic

ответ

4

Для того, чтобы использовать inproc:// транспорт, все сокеты нужно делить один и тот же контекст (который является поточно-сейф).

Кроме того, если вы используете один и тот же контекст, вам не нужны никакие бэкенд ввода/вывода нити для ZMQ

Вы не упоминаете, какую ОС вы работаете под землей, но ipc:// транспорт доступен только при самый * nix. В окнах вы можете иметь только следующие транспорты: tcp: //, inproc: //, pgm: //. Для получения дополнительной информации ознакомьтесь с документацией zmq_connect.