【问题标题】:ZeroMQ server and client on one PC一台 PC 上的 ZeroMQ 服务器和客户端
【发布时间】:2018-09-18 00:13:38
【问题描述】:

我将这种模式用于 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上同时使用server-client和client-server通信?

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

计算机必须能够发送数据并同时接收和处理来自其他计算机的数据。

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

【问题讨论】:

  • 在该示例中,数百个客户端可以发送请求。服务器将为这些请求中的每一个运行一次它的 req/reply 循环。所以服务器是单线程的,但最终会处理所有请求。您可以并行运行该客户端多次并看到它们都得到响应。

标签: python sockets zeromq pyzmq


【解决方案1】:

could run that client many times in parallel

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

本地主机操作系统可以同时运行基于 ZeroMQ 的客户端代码多次[True]
可以同时运行基于 ZeroMQ 的客户端代码多次[是的]
[任何生态系统] 可以多次并行运行基于 ZeroMQ 的客户端代码[False]

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

人们可能会喜欢先简短阅读介绍性视图,了解 [ ZeroMQ hierarchy in less than a five seconds ] 部分中简要介绍的主要概念元素,因为它将帮助我们在更深入的视图中使用相同的语言基于 ZeroMQ 的 域的可能性。

如何在一台PC上同时使用server-client和client-server通信?

简单:
一台 PC 可以首先启动一个 python 解释器,运行server.py-side 代码。下一个可以启动第二个 python 解释器(在另一个 linux 终端、windows 窗口或cmd-shell 中)并运行client.py-side 代码。这将起到魅力。

如果对details, beware that REQ/REP Scalable Formal Communication Archetype Pattern 感兴趣,对任何生产级专业代码来说都是非常危险的,因为它可以(并且将)轻松地将 变成一个主要无法避免、无法挽救的相互死锁(简单地说分布式对FSA:FSA可能陷入死锁状态,双方都无法挽救并继续相互合作的流动)

我们是否需要创建线程来实现这一点?

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

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


最好的下一步?

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

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

【讨论】:

    【解决方案2】:

    根据 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")
    

    在您作为发布者进行广播的同时 发布者.发送(消息)

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

    【讨论】:

      猜你喜欢
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多