gpt4 book ai didi

零MQ + Julia : how to set a flag

转载 作者:行者123 更新时间:2023-12-02 06:53:52 25 4
gpt4 key购买 nike

我正在将 Julia 与包 ZMQ 一起使用.

我已成功使用 ZMQ 模式经销商/路由器发送和接收消息。

以下是我接收消息的方式:

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' has no method matching recv(::Socket, ::Int64)

那么Julia中是不是不能使用非阻塞模式呢?

问题 1)
我提出了一个问题here .

如果我是对的,这个问题的答案是关于多线程+阻塞。

我知道这可行,但我更喜欢使用单线程+非阻塞。

问题 2)
@Chisholm 谢谢你给我 source of ZMQ.jl .
但我做了这样的测试:

dataRecv = bytestring(ZMQ.recv(sockRouter))
println("after recv")

如果我执行上面的代码,它将在 recv 处阻塞。
换句话说,在我向它发送消息之前,它不会打印“recv 之后”。

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

最佳答案

查看ZMQ.jl中的代码,似乎阻塞是由:zmq_msg_recv之后的wait引起的,所以这里是另一个名为 pollrecvrecv 定义,可以在主模块中定义(无需更改 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应该换成其他处理。

关于零MQ + Julia : how to set a flag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33674604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com