我正在使用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()
答案 0 :(得分:0)
可能是因为当systemA上的reactor正在处理某些数据时,systemB碰巧向systemA发送了一条通知消息(这是我的应用程序的一部分),而zmq也正在侦听传入的消息。
听起来不对。 ZeroMQ实现了编程的Actor模型,其中消息排队(在发送方,网络本身和接收方),并在连接允许时进行传输。因此,在ZeroMQ中发送和接收消息时不会隐式进行重新聚合。因此,即使SystemA在SystemB发送通知时忙于做其他事情,也不会造成任何问题。
zmq.Error.Again听起来像EAGAIN很好地为Pythonesque原因包裹起来。如果在设置了ZMQ_DONTWAIT标志的情况下发送消息,则由zmq_send()返回,但由于某种原因,无法发送消息。可能的原因包括(但不限于):
一般说明
ZMQ不保证邮件传递。成功的zmq_send仅表示消息已排队等待发送。
如果条件(即套接字已连接且接收者实际上正在调用zmq_recv)是正确的,则消息将全部转移,或者根本不转移。什么都不是。
这与通信顺序进程环境形成对比,在此环境中,除非收件人已准备好并等待接收消息,否则无法发送消息。因此,使用CSP,当发送消息时,您知道它已被接收 - 一次集合。在需要担心容错/恢复/等的环境中,这种情况要好得多。