【发布时间】:2015-11-12 15:06:37
【问题描述】:
我将 Julia 与包 ZMQ 一起使用。
我已成功使用 ZMQ 模式 Dealer/Router 发送和接收消息。
以下是我收到消息的方式:
dataRecv = bytestring(ZMQ.recv(sockRouter))
但它正在阻塞。我需要的是非阻塞。
在带有 ZeroMQ 的 c++ 中,我们可以这样做:
zmq_msg_recv(&message, socket, 0); // blocking
zmq_msg_recv(&message, socket, ZMQ_DONTWAIT); // non-blocking
在julia,我找到了一个关键词:ZMQ.ZMQ_DONTWAIT,但是不知道怎么用。我试过这样:
dataRecv = bytestring(ZMQ.recv(sockRouter, ZMQ.ZMQ_DONTWAIT))
但我得到一个错误:
'recv'没有匹配recv(::Socket, ::Int64)的方法
那么在 Julia 中就不能使用非阻塞模式了吗?
问题 1)
我提出了一个问题here。
如果我是对的,这个问题的答案是关于多线程 + 阻塞。
我知道这可行,但我更喜欢使用单线程 + 非阻塞。
问题 2)
@Chisholm 谢谢你给我source of ZMQ.jl。
但我做过这样的测试:
dataRecv = bytestring(ZMQ.recv(sockRouter))
println("after recv")
如果我执行上面的代码,它将在recv处阻塞。
换句话说,在我向它发送消息之前,它不会打印“recv 之后”。
所以我认为这完全是一种阻塞模式。
【问题讨论】:
-
如果您查看源代码 (github.com/JuliaLang/ZMQ.jl/blob/master/src/ZMQ.jl#L506),您会发现 recv 已经在设置标志 ZMQ_DONTWAIT。那一定不是你的问题。
-
@Chisholm 但是,当我执行
dataRecv = bytestring(ZMQ.recv(sockRouter))时,它会阻塞。
标签: zeromq julia nonblocking