Python标准库的socket
.create_connection()
方法具有源地址选项,用于控制连接使用的源IP。
给定一个具有多个地址的机器,如何用Python ZeroMQ套接字完成同样的工作?
在这种情况下,我一直在使用Linux的iproute2 ip addr add
来创build地址和ZeroMQ PUB/SUB
socket-archetypes。
socket
读取有点棘手 – “对手” (不是) 为什么?
古典socket
是一个免费的线束资源。
ZeroMQ是一个相当复杂的行为思想和原则(更好的分布式行为)的层次结构,帮助设计智能分布式计算系统,而不涉及控制风暴中事件的实际流程的低级别(ZeroMQ抽象)细节。在苛刻的条件下,所有的分布式计算系统都是开放的(如果ZeroMQ承诺保留的高级抽象要被实现,并且要让设计者的注意力集中在他/她的核心应用程序部分,而不是重新设计车轮(包括所有的试验和错误)在操作系统资源上的拉线和摇动系统服务,以收集一些低悬的水果类型)。
由于这些原因, 直接忘记了ZeroMQ是“像东西一样的 socket
”
1:
ZeroMQ承诺可以轻松地重复使用一些简单的可扩展正式通信模式原型,提供特定的分布式行为{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }
{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }
{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }
。
2:
除了仅使用无设备的 inproc://
transport-class的情况外,在所有其他情况下,ZeroMQ需要一个或多个可调“ 引擎 ”的实例 – 一个Context( nIOthreads = N )
, N >= 1
。
3:
有了这个,任何(未来的套接字 ) 接入点都可以被实例化,从出生的那一刻起就具有行为原型:
aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB ) # this is NOT a <SOCKET> # ^^^^^^__________________ even it was typed in
4:
有一个“ 接入点 ”的实例准备“内部”的本地“ 引擎 ”,可以锁定在外部现实的物化,使用一个或多个(是的,更多…哇! /吹口哨从一个单一的访问点“行为节点”)调用任何一种方法:
.bind(
<transport-class>://<a-class-specific-address>
)
要么
.connect(
<transport-class>://<a-class-specific-address>
)
5:
当且仅当第一个live .connect .connect()
RTO就绪的接入点B(具有任何匹配的行为配对.bind()
RTO就绪的接入点A“ 被访问 ”时,ZeroMQ消息/信令原型获取生活(命名它也是一个套接字可能是由于历史的原因,以缓解时代的解释)
( PUB/PUB
永远不会适合,因为显而易见的原因,而PUB/SUB
和许多其他行为 – 原型对将会和可爱地匹配,并形成相互“兼容”的行为,最终将会继续存在并保持这种状态)
只需在呼叫中使用完全合格的规格即可
.bind(
"{ tcp | pgm | epgm }://<ip>:<port#>"
)
方法,就完成了。
那很简单。
很酷,不是吗?
在性能调整,延迟削减和安全性调整等方面,还有许多令人惊喜的惊喜。
当试图将.connect()
发送到远程时,我在协议文档中找到了答案,将源ip放在连接字符串的分号前:
rc = zmq_connect( socket, "tcp://192.168.1.17:5555;192.168.1.1:5555" )
在Python中,这看起来像:
socket = zmq.Context().socket( zmq.SUB ) socket.connect( 'tcp://192.168.1.17:5555;192.168.1.1:5555' )