如何解决PyZMQ 分段错误,通过 bash 脚本重新启动后消息未到达
我目前面临一个问题,即代理在随机时间段后抛出分段错误。使用 bash 脚本重新启动代理会导致消息未到达。 遗憾的是,我无法重现这个问题。我知道这很可能与 zmq 的部分错误使用有关,并且该错误是由 c python 抛出的。
系统运行 3 个不同的进程。
- 进程,哪个任务是处理发送数据,哪个是订阅者
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://127.0.0.1:8100")
socket.setsockopt(zmq.SUBSCRIBE,b'')
poller = zmq.Poller()
poller.register(socket,zmq.POLLIN)
while True:
try:
socks = dict(poller.poll())
if socket in socks and socks[socket] == zmq.POLLIN:
action,values = socket.recv_pyobj()
##### handling of data #######
except Exception as e:
print(e)
- 进程,作为代理
def main():
context = zmq.Context()
# Socket facing clients
frontend = context.socket(zmq.XSUB)
frontend.bind("tcp://127.0.0.1:5557")
# Socket facing services
backend = context.socket(zmq.XPUB)
backend.bind("tcp://127.0.0.1:8100")
print("starting broker...")
while True:
try:
zmq.proxy(frontend,backend)
except KeyboardInterrupt:
print("stopping broker...")
frontend.close()
backend.close()
context.term()
quit()
except Exception as e:
print(f"Failed with {e}")
if __name__ == "__main__":
main()
- 进程运行多个线程来发布数据。
socket_pub = context.socket(zmq.PUB)
socket_pub.connect("tcp://127.0.0.1:5557")
while True:
# pre processing f.e. outgoing requests
######
# sending results
message = ["Action",{"foo": "bar"}]
socket_pub.send_pyobj(message)
由于我无法重现错误,因此无法修复它,我试图使用 bash 脚本绕过它。 在进程 nr 中抛出分段错误。 2(代理)。 因此 bash 脚本只是重新启动它。
#!/bin/bash
until python3 process2.py; do
echo "bridge broker crashed with exit code $?. Respawning.." >&2
sleep 1
done
如果进程因分段错误而终止,那么 bash 脚本会正确地重新生成进程。 但是来自进程 3 的通知不再到达进程 1。
我无法找出发生这种情况的原因。我在本地重建它,如果我手动重新启动代理(没有分段错误),消息会再次直接到达。
有没有人知道为什么会发生这种情况,或者我是否必须找到分段错误的最初原因?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。