如果没有收到回复,则返回ZeroMQ“Restart”

2024-06-01 20:46:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python程序,它将高度数据从客户机发送到服务器程序。我的服务器程序不会一直运行,所以如果我没有收到响应,我希望它再试一次。在

到目前为止,我所知道的是,如果20秒内没有给出响应(来自服务器),它会导致异常并调用我的输入。在我第二次尝试之前,它工作得很好。在

这是我的代码:

import zmq
from time import sleep

global radius
context = zmq.Context()
print("Remote Deployment Application")
print("Lightweight ZMQ Communication")
print("Connecting to Desk Ctrl Service")
socket = context.socket(zmq.REQ)
socket.connect("tcp://192.168.1.9:5555")
socket.setsockopt(zmq.RCVTIMEO, 30000)
socket.setsockopt(zmq.LINGER, 0) 


#  Do 10 requests,waiting each time for a response
def __init__(self, height):
        self.height = height

def start():
    global height
    height = input("Enter in request: ")
    SendHeightVal()


def SendHeightVal():
    global userinput
    global height
    print("Sent Request. Awaiting Reply.")
    so_bytes = height.encode()
    socket.send(so_bytes)
    so_bytes = 0
    try:
       message = socket.recv()
    except:
        print("Something went wrong. No response from server!")
        message = None       
        start()    
    print(message)
    start()

错误如下:

^{pr2}$

Tags: fromimportmessagebytessotimedefcontext
2条回答

让我们从一个简单的必备功能清单开始:

" [agent-A]sends height data from my client to my server program. My server program [agent-B]will not be always running so if I don't receive a response I would like it [agent-A] to try again."

为此,
REQ/REP硬接线两步
[A].send()-[B].recv()-[B].send()-[A].recv()-[A].send()-[B].recv()-。。。 不是有希望的,更不是一个安全的选择。在

1)始终设置zmq.LINGER = 0以避免僵尸和挂断(执行此操作时为+1)

2)如果不需要保持所有[A]-端数据的交付,则可以享受zmq.IMMEDIATE只向live[B]zmq.CONFLATE只交付[A]-side.send()

3)如果需要保持所有[a]端数据的交付,则必须重新考虑发送到[a]端的策略,使其对丢失的[B]端变得健壮,从而避免盲目乐观的数据被泵送到Context()-实例控制中,但相当昂贵且非常有限的资源,或者小心计划并预分配适当的容量,以便在未来不确定的地方(或不确定)或不可避免的出现(或不确定)之前,保持对所有容量的内部存储,或不可避免地出现[A]侧的丢弃或阻塞或异常情况。在

4)永远不要指望内置的琐碎(原始)原型能够满足您的生产需求,这些原型是一些更智能、特定问题的分布式信令和消息传递基础设施的乐高积木,而不是解决所有属性(主要是在这些原始工具出现时未知和未定义的)的魔杖因此,更多的工程设计工作将会到来,因为人们会走出教科书中的例子来设计健壮的分布式系统。下面是一种使用{ PUSH/PULL + PULL/PUSH | PAIR/PAIR | XREQ/XREP }组合加上心跳看门狗和重新发现远程代理的方法。稍后可能会添加一些其他原型,以提高N+1故障恢复能力或使用工作负载平衡器或远程控制台或延迟驱动的非现场远程日志记录(如果需要),所有这些都取决于超出初始发布或几个sloc的大量细节。在

5)始终处理异常,即使“大师”告诉你不必这样做。为什么?在中,任何问题都不再是一个公正的本地isuue,因此未经处理的异常,陷入某个代理的无声死亡将导致丢失此类代理的全球影响(许多其他代理确实依赖),并且可能很容易在没有任何本地原因的情况下被阻止

6)在生产领域,将需要更多的努力来保护任何智能基础设施免受远程故障和类似DoS的事件的影响,这些事件会影响到本地-Context()SPOF,因此{a1}体系结构设计确实是一个非常有趣和要求很高的领域。在

选中this,您将发现:

socket zmq.REQ will block on send unless it has successfully received a reply back.

这意味着您在收到答复之前不能再发送另一个请求。ZMQ有不同的消息传递模式,即您使用的客户机/服务器zmq.REQ/zmq.REP。在

Any attempt to send another message to the socket (zmq.REQ/zmq.REP), without having received a reply/request will result in an error:

....
socket.send ("Hello")
socket.send ("Hello1")
....

Error: zmq.core.error.ZMQError: Operation cannot be accomplished in current state

这就是为什么你会得到例外:

zmq.error.ZMQError: Operation cannot be accomplished in current state

相关问题 更多 >