zmq管道模式无法在多进程中工作?

时间:2015-12-09 13:18:35

标签: queue zeromq pipeline pyzmq

我认为我没有以正确的模式使用 zmq ,我想要做的是:

  1. 在多进程中通过zmq发送消息
  2. 在多个客户端接受消息,但一条消息只能接受一次
  3. 根据第二个要求我认为 pipeline 应该没问题(PUSH/PULL),但这种模式在多进程中不起作用:

    def foo(i):
        return i
    
    def producer():
        context = zmq.Context()
        zmq_socket = context.socket(zmq.PUSH)
        zmq_socket.bind("tcp://127.0.0.1:5559")
    
        with concurrent.futures.ProcessPoolExecutor(max_workers=10) as executor:
            futs = [executor.submit(foo, i) for i in range(10)]
            for fut in concurrent.futures.as_completed(futs):
                work_message = { 'num' : fut.result() }
                zmq_socket.send("test")
    
    producer()
    

    所以,也许我应该使用PUB/SUB模式,但这不符合第二个要求。

    实际上我想要的是这样的:

    PUSH|-----|                  | PULL
    PUSH|-----|                  | PULL
    PUSH|-----|----- DEVICE -----| PULL
    PUSH|-----|                  | PULL
    PUSH|-----|                  | PULL
    

1 个答案:

答案 0 :(得分:0)

不完全是rogerZeroMQ PUSH/PULL 模式

它只是做了你想做的其他事情。

ZeroMQ是一个精彩的工具箱套件,包含预先烘焙的行为,具有组装更复杂行为模型的巨大潜力,需要

从理解原始角色开始,而不是设计你的功能需求。

PUSH/PULL 正式沟通场景有两个参与者:

1st:PUSH选择电话和电话。谁?连接的PULL - 侧。 PUSH一旦决定从语音邮件中选择它,就会留下PULL要收听的语音邮件。

第二名:PULL一方(在某个时间点,不一定正好在1.)听到铃声响起并接听电话。

第3名:PULL,如果指示,则处理来自PUSH

的收到的讯息

本身就是更多。

ZeroMQ基元组件的程序集:

是的,有更进一步实现目标的方法:

使用相互连接的适当ZeroMQ原语来补充您的功能需求,以满足您的额外要求。

最简单的一个,来自“代码已连接,第I卷。”的第1章 - 基于循环的消息转发到池中 - “工人” -processes

Round-robin forwarding to a Pool

更专业的程序集可以为智能分布式复杂行为模型创建其他功能:

enter image description here

通常,“控制+信令” SIG_PLANE 与主要的功能处理并行实施。

自我诊断服务,用于不间断处理场景的听觉/自我修复信令,远程非阻塞日志服务,前端MVC / GUI平面是最典型的分层设计目标。

你的任务?

如果对更多功能不感兴趣,只需 .connect() 您的期货计算 PUSH -ers到PULL个端点。

这个中间步骤(表现/失败分析奇点)可以收集它的 PULL -ing入口侧和右走 PUSH 在它的另一个端点,在这里 - 循环的基础上,朝着实际工作人员的群体(他们正在等待他们的 .connect() -ed 的任务来自“sink”-collector实体的传入任务的PULL -er入口端点 - 来自收集的FIFO的任务(注意缓冲容量和为此付出的性能开销),只是去 “next” 一个,就行了。

________________________________                                                      _____________________________
process(0)|....[PUSH].connect(A)|-         ________________________________         -|.connect(B)[PULL] process(-1)
process(1)|....[PUSH].connect(A)|--       |                                |       --|.connect(B)[PULL] process(-2)
process(2)|....[PUSH].connect(A)|---   ---.bind(A)[PULL]:NOP:[PUSH].bind(B)|---   ---|.connect(B)[PULL] process(-3)
process(3)|....[PUSH].connect(A)|--       |________________________________|       --|.connect(B)[PULL] process(-4)
...                                                                                                     ...
process(n)|....[PUSH].connect(A)|-                                                  -|.connect(B)[PULL] process(-m)

就这么简单。

享受酷ZeroMQ工具包。