扭曲与zmq给出奇怪的错误

时间:2017-01-21 20:47:09

标签: python asynchronous twisted zeromq

我正在使用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()

1 个答案:

答案 0 :(得分:0)

嗯,我对Twisted一无所知,但

  

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

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

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,当发送消息时,您知道它已被接收 - 一次集合。在需要担心容错/恢复/等的环境中,这种情况要好得多。