我认为我没有以正确的模式使用 zmq
,我想要做的是:
zmq
发送消息根据第二个要求我认为 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
答案 0 :(得分:0)
ZeroMQ
PUSH/PULL
模式它只是做了你想做的其他事情。
ZeroMQ
是一个精彩的工具箱套件,包含预先烘焙的行为,具有组装更复杂行为模型的巨大潜力,需要。
从理解原始角色开始,而不是设计你的功能需求。
PUSH/PULL
正式沟通场景有两个参与者:
1st:PUSH
选择电话和电话。谁?连接的PULL
- 侧。 PUSH
一旦决定从语音邮件中选择它,就会留下PULL
要收听的语音邮件。
第二名:PULL
一方(在某个时间点,不一定正好在1.)听到铃声响起并接听电话。
第3名:PULL
,如果指示,则处理来自PUSH
本身就是更多。
ZeroMQ
基元组件的程序集:使用相互连接的适当ZeroMQ
原语来补充您的功能需求,以满足您的额外要求。
最简单的一个,来自“代码已连接,第I卷。”的第1章 - 基于循环的消息转发到池中 - “工人” -processes
更专业的程序集可以为智能分布式复杂行为模型创建其他功能:
通常,“控制+信令” 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
工具包。