代码之家  ›  专栏  ›  技术社区  ›  v.oddou

nim的异步ZeroMQ

  •  1
  • v.oddou  · 技术社区  · 6 年前

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

    还有一个nim端口: this one

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

    我认为async/await是一种必须跳转到最上面的主循环(框架循环)的本地语言,因此API必须具有异步意识。

    就我而言,这是一个完全的误解吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   v.oddou    6 年前

    本机ZeroMQ API支持阻塞和非阻塞I/O-s。

    为此,有 flags 哪里 zmq.NOBLOCK 可以添加,以实现无阻塞的操作模式。


    相应的语言包装器功能决定。

    如果我读了 ZeroMQ-wrapper ,您在上面提到过,在我看来,两者都有一个硬编码的阻塞版本 send() recv() 函数包装。

    在以下情况下,包装器似乎也不支持正确的有线消息大小调整 -a的基于节点 遇到另一个使用ZeroMQ 2.1版的节点,这在异构系统中仍然很有趣和常见 领域。

    ZeroMQ还具有 poll() 方法,配备 timeout 参数,以便您的多路I/O操作可以产生在某些软实时控制约束下如何操作多个I/O通道的所有想要的方法。

        2
  •  1
  •   Clonk    2 年前

    虽然当时公认的答案是正确的;async with ZMQ现在使用包装器构建,提供了以下示例:

    请参见:

    您还可以绕过阻塞行为或ZMQ,以避免使用poll/sleepsync手动阻塞异步调度循环:

    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