【问题标题】:zeromq + julia: how to set a flagzeromq + julia:如何设置标志
【发布时间】: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 之后”。

所以我认为这完全是一种阻塞模式。

【问题讨论】:

标签: zeromq julia nonblocking


【解决方案1】:

查看ZMQ.jl 处的代码,似乎阻塞是由:zmq_msg_recv 之后的wait 引起的,所以这是recv 的另一个定义,称为pollrecv,可以在主模块中定义(无需更改ZMQ.jl):

function pollrecv(socket::ZMQ.Socket,zmsg::Message)
    rc = -1
    while true
        rc = ccall((:zmq_msg_recv, ZMQ.zmq), Cint, (Ptr{Message}, Ptr{Void}, Cint),
                    &zmsg, socket.data, ZMQ.ZMQ_DONTWAIT)
        if rc == -1
            if !(ZMQ.zmq_errno() == Base.Libc.EAGAIN)
                throw(ZMQ.StateError(ZMQ.jl_zmq_error_str()))
            end
            return false
        else
            ZMQ.get_events(socket) != 0 && notify(socket)
            break
        end
    end
    return true
end

您可以通过以下方式使用此功能:

msg = Message()
while !pollrecv(s1,msg)
    sleep(3)
    println("ZZzzzz...")
end
out = convert(IOStream,msg)
println(takebuf_string(out))
close(msg)
ZMQ.send(s1,"response important for next receive")

当然while使用轮询实现阻塞,sleep应该换成其他处理。

【讨论】:

  • ZMQ.get_events(socket) != 0 && notify(socket) 你忘了if 或其他什么吗?
  • 无论如何,感谢您的代码,但它似乎不起作用。
  • if 没有忘记,它是短路逻辑简写 - 只有当第一个表达式为真时,才会评估 post && 表达式。
  • 代码是怎么失败的?不编译?它在我的机器上运行(否则会犹豫发布)
  • 好的。我现在用 11 :D
【解决方案2】:

临时答案:

根据this question的回答:

但它通过任务通过阻塞 API 公开

我认为我们别无选择,因为只有一个阻塞 API。

如果有人发现如何立即使用非阻塞 API,请留下您的回答,我会接受您的回答。谢谢。

【讨论】:

    猜你喜欢
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2021-12-27
    • 2019-04-10
    相关资源
    最近更新 更多