cer*_*wen 6 python linux zeromq
Python 标准库的socket
.create_connection()
方法有一个源地址选项,用于控制连接使用的源 IP。
给定一台具有多个地址的机器,我如何使用 Python ZeroMQ 套接字做同样的事情?
在这种情况下,我一直在使用 Linux 的 iproute2ip addr add
来创建地址和 ZeroMQPUB/SUB
套接字原型。
socket
- “交易对手” (不是)为什么?
Classicalsocket
是一种可免费使用的资源。
ZeroMQ 是一个相当复杂的行为(更好的分布式行为)的思想和原则的层次结构,它有助于设计智能分布式计算系统,而无需触及控制风暴中事件实际流的低级(ZeroMQ 很好抽象)细节在严酷的条件下,所有分布式计算系统都是开放的(并且必须相应地在低级别处理,如果要实现 ZeroMQ“承诺”保留的高级抽象并且让设计者的思想更容易专注于他的/她的核心应用程序部分,而不是重新设计轮子(包括所有的试验和错误)来拉动 O/S 资源的字符串和震动系统服务以收集一些低悬的果实)。
由于这些原因,最好直接忘记 ZeroMQ 是“类似-socket
”
1:
ZeroMQ 承诺可以轻松重用一些提供特定分布式行为的微不足道的可扩展正式通信模式原型{ PUB/SUB | PUSH/PULL | PAIR/PAIR | XPUB/XSUB | ... | REQ/REP }
。
2:
除了只使用无设备 inproc://
传输类的情况外,在所有其他情况下,ZeroMQ 需要一个或多个可调“引擎”的实例- a Context( nIOthreads = N )
, N >= 1
.
3:
有了这个,任何(未来的套接字)接入点都可以被实例化,从诞生的那一刻起就具有行为原型:
aSubscribeCHANNEL = aLocalCONTEXT.socket( zmq.SUB ) # this is NOT a <SOCKET>
# ^^^^^^__________________ even it was typed in
Run Code Online (Sandbox Code Playgroud)
4:
在本地“引擎” “内部”准备好“接入点”实例,可以将其物化锁定在外部现实中,使用一个或多个(是的,更多......哇!意味着更多的传入拉动-从单个接入点“行为节点”吹出的字符串/口哨声)调用以下任一方法:
或
.bind(
<transport-class>://<a-class-specific-address>
)
.connect(
<transport-class>://<a-class-specific-address>
)
5:
当且仅当一个.bind()
-RTO-ready 接入点A“被第一个实时.connect()
-RTO-ready 接入点B访问” ,具有任何匹配的行为配对,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")
Run Code Online (Sandbox Code Playgroud)
在 Python 中,这看起来像:
socket = zmq.Context().socket(zmq.SUB)
socket.connect('tcp://192.168.1.17:5555;192.168.1.1:5555')
Run Code Online (Sandbox Code Playgroud)