gpt4 book ai didi

python - ZeroMQ 'Restart' 如果没有收到回复

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:37 25 4
gpt4 key购买 nike

我有一个 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()

这里是错误:

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "client.py", line 44, in <module>
start()
File "client.py", line 22, in start
SendHeightVal()
File "client.py", line 37, in SendHeightVal
start()
File "client.py", line 22, in start
SendHeightVal()
File "client.py", line 30, in SendHeightVal
socket.send(so_bytes)
File "/usr/local/lib/python3.6/site-packages/zmq/sugar/socket.py", line 391, in send
return super(Socket, self).send(data, flags=flags, copy=copy, track=track)
File "zmq/backend/cython/socket.pyx", line 727, in zmq.backend.cython.socket.Socket.send
File "zmq/backend/cython/socket.pyx", line 774, in zmq.backend.cython.socket.Socket.send
File "zmq/backend/cython/socket.pyx", line 249, in zmq.backend.cython.socket._send_copy
File "zmq/backend/cython/socket.pyx", line 244, in zmq.backend.cython.socket._send_copy
File "zmq/backend/cython/checkrc.pxd", line 25, in zmq.backend.cython.checkrc._check_rc
zmq.error.ZMQError: Operation cannot be accomplished in current state

最佳答案

让我们从强制性功能的简单 list 开始:

" [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 < em>[B] 和 zmq.CONFLATE 只传递 [A] 端所做的最“新鲜”的值.send()

3 ) 如果需要保持所有 [A] 端数据的交付,则必须重新考虑在 [A] 上发送的策略-side 对缺失的 [B]-side 变得健壮,以避免盲目和乐观地将数据泵入 Context() - 实例控制,但相当昂贵且相当有限的资源,或仔细计划和预先分配应有的能力,以便能够真正在内部存储所有的资源,直到 [B]- future 某个不确定的地方出现(或不出现)或 [A] 端丢弃或阻止或异常将是不可避免的。

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

5 ) 始终处理异常,即使“大师”告诉您不需要那样做。为什么?在 任何问题都不再只是本地问题,因此未处理的异常,陷入某些代理的无声死亡将导致缺少此类代理的全局影响(许多)其他人确实依赖并且可能很容易在没有任何本地原因可见的情况下被阻止给他们。

6 ) 在生产领域,需要付出更多努力来保护任何智能基础设施免受远程故障和类似 DoS 事件的影响,这些事件会影响本地 Context() SPOF,因此确实架构设计是一个既有趣又要求很高的领域。

关于python - ZeroMQ 'Restart' 如果没有收到回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49417430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com