一台 PC 上的 ZeroMQ 服务器和客户端

ZeroMQ server and client on one PC

我将此模式用于 ZeroMQ 上的服务器:

import time
import zmq

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")

while True:
    message = socket.recv()
    print("Received request: %s" % message)
    time.sleep(1)
    socket.send(b"World")

此模式适用于客户:

import zmq

context = zmq.Context()
print("Connecting to hello world server…")
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")

#  Do 10 requests, waiting each time for a response
for request in range(10):
    print("Sending request %s …" % request)
    socket.send(b"Hello")

    #  Get the reply.
    message = socket.recv()
    print("Received reply %s [ %s ]" % (request, message))

如何在一台PC上同时使用服务器-客户端、客户端-服务器通信?

我们需要创建线程来实现这个吗?

需要电脑可以发送数据,同时接收和处理来自其他电脑的数据。

P.S.: 可以this解决我的问题吗?

嗯,实际上可以
该声明虽然被认为是出于善意解释某事,但可能而且实际上会极大地损害一个人的计算机科学的一般观点,因为它具有极强的误导性。

本地主机 O/S 可以 运行 一个基于 ZeroMQ 的客户端代码并发多次 [True]
可以 运行 一个基于 ZeroMQ 的客户端代码并发多次 [True]
[any-ecosystem] 可以 运行 一个基于 ZeroMQ 的客户端代码并行多次 [False]

None 可以而且永远不会。 Cray 出色的并行处理语言 都无法实现,因为 ZeroMQ 主要是异步的,“只是”-[CONCURRENT] 进程调度生态系统,其中每个主引擎,在每个 Context()-instance(s) 中运行,运行 1+ IO 线程的内部池(好吧,实际上是 0+,如果纯粹主义者会声称一个特殊情况 :o)),是已知的通过设计异步和独立于外部事件流,所以确实 never 真正的-[PARALLEL] 进程调度可能会出现在这里。

人们可能会先阅读一下介绍性视图,了解主要概念元素,如 [[ 不到五秒=67=] ] 部分,因为它将帮助我们在更深入的观点中说同一种语言,以深入了解基于 ZeroMQ 的 领域的可能性。

How to use the server-client, and client-server communication at the same time on one PC?

简单:
一台 PC 可以首先启动一个 python 解释器,运行 宁 server.py 端代码。接下来可以启动第二个 python 解释器(在另一个 linux 终端,或 windows window 或 cmd-shell )和 运行 client.py端代码。这将起到魅力的作用。

如果对 对于任何生产级来说主要是危险的专业代码,因为它可以(并且将会)轻松地将 变成基本上无法避免、无法挽救的相互死锁(简单地说 FSA:FSA 的分布式对可能陷入死锁双方都无法挽救并继续相互合作的状态)

Do we need to make threads for achieving this ?

好吧,实际上已经有很多线程已经在“内部”运行,如果没有其他线程,每个 python + ZeroMQ Context() 组合中已经有一些线程。

如果您打算指示 python 代码开始使用更多线程,则应该有更多关于此类意图的详细信息,然后才能帮助解决此类决策困境。使用线程还有一个主要缺点——已知的 python GIL 锁定实际上使任何此类尝试进入纯 [SERIAL],是的,逐步-step 按顺序执行代码(因为这有助于保持 GIL 保护器对数据垄断访问的影响([SERIAL]-ised 代码执行永远不会进入非原子写入的冲突情况,越少一个竞争条件,因为 GIL-stepping 实际上使每个操作成为一个原子步骤——当然,以切碎为代价,[SERIAL] GIL-stepping 遍历所有线程池执行的代码执行图。安全吗?好吧,是的,但比必要的要慢)。


最好的下一步是什么?

如果确实认真并热衷于研究[分布式系统]设计,下一步最好是阅读 Pieter HINTJENS 的精彩著作 [Code Connected,第 1 卷 ] ( pdf online ),所有的时间和努力都会得到精心设计的实用观点和大量经验的回报,因此需要尽可能多地从 ZeroMQ 中榨取,并将交付给一个人的进一步智能设计。

敬请期待,这是朝着正确方向迈出的一步。

根据 ZMQ 中的示例,您也可以使用相同的代码同时发布和订阅不同的服务器

import zmq
import time
context = zmq.Context()

subscriber = context.socket (zmq.SUB)
subscriber.connect ("tcp://192.168.55.112:5556")
subscriber.connect ("tcp://192.168.55.201:7721")
subscriber.setsockopt (zmq.SUBSCRIBE, "NASDAQ")

publisher = context.socket (zmq.PUB)
publisher.bind ("ipc://nasdaq-feed")

while True:
    message = subscriber.recv()
    publisher.send (message)

所以你是连接到那两个服务器的订阅者

 subscriber.connect ("tcp://192.168.55.112:5556")
 subscriber.connect ("tcp://192.168.55.201:7721")

同时您以发布者的身份进行广播 publisher.send(留言)

这就是构建点对点分布式系统的方式,每个服务器都是订阅者和发布者