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功能决定。 . .
如果我阅读了您上面提到的 nim ZeroMQ-wrapper,在我看来,send()
和 recv()
[=41= 都有一个硬编码的阻止版本].
如果 nim-based node of a distributed-system meets another node, which is using ZeroMQ version 2.1.+, which is still interesting and common in heterogeneous distributed-system 领域,包装器似乎也不支持正确的有线消息大小。
ZeroMQ 还有一个 poll()
方法,配备了一个 timeout
参数,因此您的多路复用 I/O-operations 可能会产生所有想要的方式来操作多个 I/O-channels在一些软 real-time 控制约束下。
虽然当时接受的答案是正确的;与 ZMQ 的异步现在是使用包装器构建的,并且提供了示例:
参见:
- https://github.com/nim-lang/nim-zmq/blob/master/zmq/asynczmq.nim
- https://github.com/nim-lang/nim-zmq/blob/master/examples/ex08_async_reqrep.nim
您还可以解决阻塞行为或 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
我从未使用过 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功能决定。 . .
如果我阅读了您上面提到的 nim ZeroMQ-wrapper,在我看来,send()
和 recv()
[=41= 都有一个硬编码的阻止版本].
如果 nim-based node of a distributed-system meets another node, which is using ZeroMQ version 2.1.+, which is still interesting and common in heterogeneous distributed-system 领域,包装器似乎也不支持正确的有线消息大小。
ZeroMQ 还有一个 poll()
方法,配备了一个 timeout
参数,因此您的多路复用 I/O-operations 可能会产生所有想要的方式来操作多个 I/O-channels在一些软 real-time 控制约束下。
虽然当时接受的答案是正确的;与 ZMQ 的异步现在是使用包装器构建的,并且提供了示例:
参见:
- https://github.com/nim-lang/nim-zmq/blob/master/zmq/asynczmq.nim
- https://github.com/nim-lang/nim-zmq/blob/master/examples/ex08_async_reqrep.nim
您还可以解决阻塞行为或 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