繁体   English   中英

一台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上同时使用服务器-客户端和客户端-服务器通信?

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

计算机必须能够发送数据,并同时从其他计算机接收和处理它们。

PS: 可以解决我的问题吗?

可以并行运行该客户端多次

好吧,实际上不能
尽管该声明被认为是对某些事情的良好解释,但实际上可能会严重损害人们的计算机科学一般观点,因为它极具误导性。

本地主机操作系统可能同时运行基于ZeroMQ的客户端代码很多次[正确]
可以同时运行基于ZeroMQ的客户端代码多次[True]
[any-ecosystem]可以并行运行基于ZeroMQ的客户端代码很多次[False]

没有人能够而且永远不会。 Cray出色的并行处理语言都无法实现这一目标,因为ZeroMQ主要是一个异步的,“仅”- [CONCURRENT]流程调度的生态系统,其中每个主机在每个Context() instance(s Context()内部运行),操作1个以上IO线程的内部池(好吧,如果纯粹主义者认为是一种特殊情况,则实际上为0+:o)),是设计上异步的并且独立于外部事件流,因此实际上永远不会 - [PARALLEL]进程计划可能会在此处出现。

首先,您可以对[ ZeroMQ层次结构在不到五秒钟的时间 ]部分中介绍的主要概念元素进行简短的介绍性阅读,因为这将帮助我们从更深的角度讲相同的语言,了解ZeroMQ的可能性基于域。

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

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

如果对细节感兴趣, 请注意, REQ/REP可扩展正式通信原型模式对任何生产级专业代码而言都是危险的,因为它可以(并且将)轻松地将转变为基本上不可避免的,无法挽救的互惠关系。死锁(简单地说,分布式FSA:FSA对可能陷入死锁状态,任何一方都无法从中解救并继续进行相互合作的流程)

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

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

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


最好的下一步?

如果确实很认真并且热衷于研究[分布式系统]设计,那么最好的下一步就是阅读一本神话般的Pieter HINTJENS的书[ Code Connected,第1卷 ](pdf在线),所有的时间和精力都将得到获得精心设计的实用意见和大量经验,因此需要尽可能地从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")

同时以发布者的身份广播。发送(消息)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM