Я использую 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…
}
Я не совсем уверен, что вы спрашиваете? Вы хотите узнать, можете ли вы использовать другие протоколы с 0MQ? или Вы спрашиваете, может ли 0MQ безопасно использовать из нескольких goroutines? –
Я спрашиваю, могу ли я использовать разные протоколы с 0mq, общаться между goroutines. Я могу общаться между goroutines через tcp, но я не могу сделать это с помощью inproc или ipc. Работают ли они также в гортанах Го? –
Опубликуйте некоторый код, с zmq есть миллион мелочей, которые могут вызвать некоторые проблемы ... В общем случае с ZMQ вы должны иметь возможность использовать соединение 'inproc: //', пока все находится в одном процессе. Каждый goroutine должен «делиться» одним и тем же контекстом (контексты являются потокобезопасными) и создавать каждое из них inproc: // от него. – g19fanatic