Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go ZeroMQ中的发布/订阅模式不工作_Go_Zeromq_Distributed System_Distributed Systems - Fatal编程技术网

Go ZeroMQ中的发布/订阅模式不工作

Go ZeroMQ中的发布/订阅模式不工作,go,zeromq,distributed-system,distributed-systems,Go,Zeromq,Distributed System,Distributed Systems,我正在尝试使用ZeroMQ实现一个非常基本的PUB/SUB模式。我希望有一个服务器(始终处于活动状态)向所有客户端广播消息(发布者),而不关心连接的客户端。 如果客户端以订阅者身份连接到此服务器,则应接收消息 但是,我无法使用PUB/SUB发送消息 在Python中,它将是: # publisher (server.py) import zmq ctx = zmq.Context() publisher = ctx.socket(zmq.PUB) publisher.bind('tcp://1

我正在尝试使用ZeroMQ实现一个非常基本的
PUB/SUB
模式。我希望有一个服务器(始终处于活动状态)向所有客户端广播消息(发布者),而不关心连接的客户端。 如果客户端以订阅者身份连接到此服务器,则应接收消息

但是,我无法使用
PUB/SUB
发送消息

在Python中,它将是:

# publisher (server.py)
import zmq

ctx = zmq.Context()
publisher = ctx.socket(zmq.PUB)
publisher.bind('tcp://127.0.0.1:9091')

while True:
    publisher.send_string("test")

或在戈兰:

package main

import (
    "github.com/pebbe/zmq4"
    "log"
    "time"
)

func Listen(subscriber *zmq4.Socket) {
    for {
        s, err := subscriber.Recv(0)
        if err != nil {
            log.Println(err)
            continue
        }
        log.Println("rec", s)
    }
}

func main() {
    publisher, _ := zmq4.NewSocket(zmq4.PUB)
    defer publisher.Close()
    publisher.Bind("tcp://*:9090")

    subscriber, _ := zmq4.NewSocket(zmq4.SUB)
    defer subscriber.Close()
    subscriber.Connect("tcp://127.0.0.1:9090")

    go Listen(subscriber)
    for _ = range time.Tick(time.Second) {
        publisher.Send("test", 0)
        log.Println("send", "test")

    }
}
我是否误解了这种模式,或者在连接时是否需要从客户端向服务器发送特定的信号。我对golang版本感兴趣,只使用python版本进行测试。

我是否误解了这种模式?是的,幸运的是你做到了。 ZeroMQ原型的定义是为了表示某种行为。如前所述,
PUSH
-archetype AccessPoint“通过”到目前为止设置的所有通信通道推送每条消息,
PULL
-er AccessPoint将任何已经到达的消息拉到“它的手上”
PUB
-lisher AccessPoint发布,
SUB
-scriber AccessPoint订阅,以便只接收与主题过滤器匹配的消息,而不接收任何其他消息

显然,这种原型“规范”有助于构建ZeroMQ智能消息传递/信令基础架构,以便于在体系结构中使用




在执行任何调试步骤之前,必须检查错误。我自己也没有用过zmq,不过,绑定的调用,从这里看地址很难闻。我可能错了,检查错误应该会提供线索。@mh cbon不,先生,
PUB
-端的
.Bind()
绝对不是问题。在订阅管理(主要问题)和避免无限死锁(在所有套接字上使用
.SetLinger(0)
方法)方面,魔鬼就在细节上,在任何紧急情况或故意执行
延迟*.Close()时实例化(所有v.4.2+API IIRC之前版本都必须)
非常感谢!这是我第一次开始了解这个问题和可能的解决方案。欢迎您,很高兴您能得到帮助。顺便说一句,关于Deblurring等的文章很棒。谢谢,您的回答确实有助于缓解nvidia smi的群集版本。如果您关注性能和超低延迟,请注意许多问题(确实是深入的)性能驱动的套接字选项调整变得必不可少。扩展是另一个可能对性能和吞吐量造成“攻击”的维度。一个人可能会成长为约64个GPU超收敛HPC群集,因此值得了解。请在适当的时候毫不犹豫地提高这些点(如果要达到超低延迟,设计必须遵循一定的标准)。无论如何,祝你好运,请继续关注!
package main

import (
    "github.com/pebbe/zmq4"
    "log"
    "time"
)

func Listen(subscriber *zmq4.Socket) {
    for {
        s, err := subscriber.Recv(0)
        if err != nil {
            log.Println(err)
            continue
        }
        log.Println("rec", s)
    }
}

func main() {
    publisher, _ := zmq4.NewSocket(zmq4.PUB)
    defer publisher.Close()
    publisher.Bind("tcp://*:9090")

    subscriber, _ := zmq4.NewSocket(zmq4.SUB)
    defer subscriber.Close()
    subscriber.Connect("tcp://127.0.0.1:9090")

    go Listen(subscriber)
    for _ = range time.Tick(time.Second) {
        publisher.Send("test", 0)
        log.Println("send", "test")

    }
}
# subscriber (client.py)
import zmq

ctx        = zmq.Context()
subscriber = ctx.socket( zmq.SUB )
subscriber.connect( 'tcp://127.0.0.1:9091' )
subscriber.setsockopt( zmq.LINGER,    0 )         # ALWAYS:
subscriber.setsockopt( zmq.SUBSCRIBE, "" )        # OTHERWISE NOTHING DELIVERED

while True:
    msg = subscriber.recv_string()                # MAY USE .poll() + zmq.NOBLOCK
    print msg
subscriber, _ := zmq4.NewSocket( zmq4.SUB )
subscriber.Connect(             "tcp://127.0.0.1:9090" )
subscriber.SetSubscribe(         filter )                 // SET: <topic-filter>

subscriber.SetLinger(            0 )    //  SAFETY FIRST: PREVENT DEADLOCK
defer subscriber.Close()                //  NOW MAY SAFELY SET:

...
msg, _ := subscriber.Recv( 0 )
package main

import (
    "github.com/pebbe/zmq4"
    "log"
    "time"
)

func Listen(subscriber *zmq4.Socket) {
    for {
        s, err := subscriber.Recv(0)
        if err != nil {
            log.Println(err)
            continue
        }
        log.Println("rec", s)
    }
}

func main() {
    publisher, _ := zmq4.NewSocket(zmq4.PUB)
    publisher.SetLinger(0)
    defer publisher.Close()

    publisher.Bind("tcp://127.0.0.1:9092")

    subscriber, _ := zmq4.NewSocket(zmq4.SUB)
    subscriber.SetLinger(0)
    defer subscriber.Close()

    subscriber.Connect("tcp://127.0.0.1:9092")
    subscriber.SetSubscribe("")

    go Listen(subscriber)
    for _ = range time.Tick(time.Second) {
        publisher.Send("test", 0)
        log.Println("send", "test")
    }
}