2012-10-10 2 views
4

나는 같은 프로그램에서 직원이면서 백엔드 엔드 포인트 인 tcp : //127.0.0.1 : 5560에 연결하는 일부 goroutines을 가지고 있다는 것을 제외하면 this as boilerplate을 사용하고 있습니다.다른 Goroutines에서 ZeroMQ 컨텍스트간에 통신하는 방법은 무엇입니까?

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

나는 당신이 무엇을 요구하고 있는지 정말로 모르겠다. 0MQ로 다른 프로토콜을 사용할 수 있는지 알고 싶습니까? 또는 0MQ가 여러 goroutines에서 사용하는 것이 안전한지 묻는 중입니까? –

+0

0mq와 다른 프로토콜을 사용할 수 있는지, goroutines간에 통신하는지 묻습니다. tcp를 통해 goroutines간에 통신 할 수 있지만 inproc 또는 ipc로는 할 수 없습니다. Go의 goroutine에서도 작동합니까? –

+0

zmq와 함께 몇 가지 코드를 게시하면 몇 가지 문제가 발생할 수있는 작은 것들이 있습니다 ... 일반적으로 ZMQ를 사용하면 모든 것이 동일한 프로세스 내에있는 한 당신은'inproc : //'연결을 사용할 수 있어야합니다. 각 goroutine은 동일한 컨텍스트 (컨텍스트는 스레드로부터 안전함)를 '공유'해야하며이 컨텍스트에서 각 inproc : // 연결을 만듭니다. – g19fanatic

답변

4

inproc:// 교통 기관을 이용하기 위하여는, 소켓의 모든 (스레드 안전) 같은 컨텍스트를 공유 할 필요가있다. 또한

같은 컨텍스트를 사용하는 경우, 당신은 어떤 백엔드를 필요가 없습니다 ZMQ

에 대한 I/O 스레드

당신이에서 실행중인 OS 언급하지 않지만, ipc:// 전송은 아래에서만 사용할 수 있습니다 대부분 * nix. 윈도우에서는 tcp : //, inproc : //, pgm : //만이 전송을 할 수 있습니다. 자세한 내용은 zmq_connect 설명서를 확인하십시오.

관련 문제