【问题标题】:twisted with zmq giving strange error扭曲 zmq 给出奇怪的错误
【发布时间】:2017-01-21 20:47:09
【问题描述】:

我正在使用 twisted with zmq 。这是应用程序的概述:

我在两个系统上运行了两个扭曲的实例,我正在使用zmq(txZmq) 进行消息传递。

systemA 提交一些要由systemB 处理的作业。作业完成后它必须通知systemA(出于某些原因)。所以在两个系统上我都有zmq 监听以及使用不同的端口发送消息。现在我收到错误: zmq.error.Again: Resource temporarily unavailable 这可能是因为当systemA 上的反应器正在处理一些数据时,系统B 碰巧向systemA 发送了一条通知消息(这是我的应用程序的一部分),zmq 也在其中监听传入消息。

所以我将systemA 上的处理部分更改为使用callInThread 的扭曲线程,也在线程内部我正在向zmq 发送消息,但我再次收到相同的错误 zmq.error.Again: Resource temporarily unavailable

为什么会这样??? 代码是这样的:

def send_remote_job():
    # do some computation like fetch from db and process then send
    send_socket.push(dumps(job_data))


recieve_socket.onPull = listen_for_notifiction()
reactor.callInThread(send_remote_job)
reactor.run()

【问题讨论】:

    标签: python asynchronous twisted zeromq


    【解决方案1】:

    嗯,我对 Twisted 一无所知,但是

    这可能是因为当 systemA 上的反应器正在处理一些数据时,systemB 碰巧向 systemA 发送了一条通知消息(这是我的应用程序的一部分),zmq 也在该 systemA 上侦听传入消息。

    听起来不太对劲。 ZeroMQ 实现了 Actor 编程模型,其中消息排队(在发送方、网络本身和接收方)并在连接允许时传输。因此,在 ZeroMQ 中发送和接收消息没有任何隐含的集合。因此,即使在 SystemB 发送通知时 SystemA 正忙于做其他事情,也不会造成任何问题。

    zmq.Error.Again 听起来像 EAGAIN 很好地结束了 Pythonesque 的原因。如果在设置了 ZMQ_DONTWAIT 标志的情况下发送了一条消息,但由于某种原因或其他原因,无法发送该消息,则 zmq_send() 将返回此值。可能的原因包括(但不限于):

    • B 和 A 之间的 zmq DEALER 或 PUSH 套接字实际上没有连接,在这种情况下检查您的连接字符串等。
    • B 发送通知的速度快于 A 可以使用它们。 B、网络和 A 上的缓冲区逐渐填满,一旦填满,就不能再发送了。但是,这似乎不太可能,因为 B 的通知是为了响应 A 向 A 发送作业,A 正在设置工作速率,并且 B 不能(除非出现错误)比 A 发送作业更快地发送通知。

    一般说明

    ZMQ 不保证消息传递。成功的 zmq_send 仅意味着消息已排队等待发送。

    如果条件(即套接字已连接且接收方实际上正在调用 zmq_recv)正确,则消息将被全部传输或根本不传输。不偏不倚。

    这与通信顺序进程环境形成鲜明对比,在这种环境中,除非收件人准备好并等待接收消息,否则无法发送消息。因此,使用 CSP,当发送消息时,您知道它已被接收 - 会合。这在必须担心容错/恢复等的环境中要好得多。

    【讨论】:

    • 我检查了你提到的两点,但一切似乎都很好:(
    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 2012-05-21
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-27
    相关资源
    最近更新 更多