微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyZMQ 分段错误,通过 bash 脚本重新启动后消息未到达

如何解决PyZMQ 分段错误,通过 bash 脚本重新启动后消息未到达

我目前面临一个问题,即代理在随机时间段后抛出分段错误。使用 bash 脚本重新启动代理会导致消息未到达。 遗憾的是,我无法重现这个问题。我知道这很可能与 zmq 的部分错误使用有关,并且该错误是由 c python 抛出的。

系统运行 3 个不同的进程。

  1. 进程,哪个任务是处理发送数据,哪个是订阅
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)
  1. 进程,作为代理
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()
  1. 进程运行多个线程来发布数据。
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 举报,一经查实,本站将立刻删除。