发布于 2018-03-06 15:27:46
本机ZeroMQ API支持阻塞和非阻塞I/O-s。
为此,可以在flags,中添加zmq.NOBLOCK,从而实现一种非阻塞的操作模式。
相应的语言包装功能决定了。。。
如果我阅读上面提到的尼姆 ZeroMQ包装器,在我看来,send()和recv()函数包装器都有一个硬编码的阻塞版本。
当一个尼姆-based节点遇到另一个节点时,包装器似乎也不支持正确的有线消息大小,后者使用的是ZeroMQ版本2.1.+,这在异构分布式系统领域仍然很有趣和常见。
ZeroMQ还有一个带有timeout参数的poll()方法,这样您的多路复用I/O操作就可以产生在一些软实时控制约束下如何操作多个I/O通道的所有需要的方法。
发布于 2022-01-20 18:36:51
虽然当时接受的答案是正确的,但现在用包装器构建了具有ZMQ的异步,并提供了一些示例:
见:
您还可以绕过阻塞行为或ZMQ,以便不使用轮询/ sleepAsync手动阻止异步分派循环:
let
zmq_timeout = 50
async_loop_time = 450 # spend more time on async stuff than on zmq stuff
var
conn = listen("tcp://127.0.0.1:36000", mode = PAIR=
poller = initZPoll([conn], ZMQ_POLLIN)
if poller.poll(timeout):
if events(poller[0]):
var res = poller[0].receive()
# Do async stuff
else:
waitFor sleepAsync(async_loop_time) # Calling sleepAsync is a trick to make the async dispatch loop progress for a time https://stackoverflow.com/questions/49128986
复制相似问题