nim 的异步 ZeroMQ

Async ZeroMQ for nim

我从未使用过 ZeroMQ,一个小时前第一次听说它。但是从指南 (this guide) 听起来好像有异步 I/O.

碰巧有一个nim端口:this one

所以我想知道,异步魔法是否与 async/await 有关,它们是 nim 端口(只是 c2nim)中不存在的关键字。那么它只是 ZMQ 内部的东西并且 API 不必为此烦恼吗?

我认为 async/await 是一个白话,它必须冒泡到最上面的主循环(框架循环),所以 API 必须是异步感知的。

这完全是我的误解吗?

Native ZeroMQ API 同时支持阻塞和 non-blocking I/O-s.

为此,有flags,其中可以添加zmq.NOBLOCK,以便实现non-blocking操作模式。


各自的language-wrapper功能决定。 . .

如果我阅读了您上面提到的 ZeroMQ-wrapper,在我看来,send()recv() [=41= 都有一个硬编码的阻止版本].

如果 -based node of a meets another node, which is using ZeroMQ version 2.1.+, which is still interesting and common in heterogeneous 领域,包装器似乎也不支持正确的有线消息大小。

ZeroMQ 还有一个 poll() 方法,配备了一个 timeout 参数,因此您的多路复用 I/O-operations 可能会产生所有想要的方式来操作多个 I/O-channels在一些软 real-time 控制约束下。

虽然当时接受的答案是正确的;与 ZMQ 的异步现在是使用包装器构建的,并且提供了示例:

参见:

您还可以解决阻塞行为或 ZMQ,以便不使用 poll / 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