我从未使用过ZeroMQ,一小时前第一次听说它。但从指南(本指南)看,似乎存在异步I/O。
它还碰巧有一个nim端口:这一个
因此,我想知道,异步魔术是否与async/await有关,这些关键字在nim端口(也就是c2nim)中不存在。那么,这仅仅是ZMQ内部的一些东西,而API不需要为此烦恼吗?
我认为异步/等待是一种流行的东西,它必须泡到最上层的主循环(框架循环),所以API必须是异步感知的。
这完全是我的误解吗?
发布于 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
复制相似问题