gpt4 book ai didi

matlab - 在 MATLAB 中开始使用 JeroMQ

转载 作者:行者123 更新时间:2023-12-04 14:29:01 24 4
gpt4 key购买 nike

我正在尝试使用 MATLAB 中的 JeroMQ,通过实现此示例( How to use jeromq in MATLAB ):

% Author : Dheepak Krishnamurthy
% License : BSD 3 Clause

import org.zeromq.ZMQ;

ctx = zmq.Ctx();

socket = ctx.createSocket(ZMQ.REP);

socket.bind('tcp://127.0.0.1:7575');

message = socket.recv(0);

json_data = native2unicode(message.data)';

message = zmq.Msg(8);
message.put(unicode2native('Received'));

socket.send(message, 0);
socket.close()

脚本运行直到行:

message = socket.recv(0);



但卡在那里。

MATLAB 将不再响应,必须使用任务管理器终止。

有人可以提示一下,如果还有其他事情要做,以使其运行?

最佳答案

JeroMQ调用签名状态:

        /**
* Receive a message.
*
* @return the message received, as an array of bytes; null on error.
*/
public final byte[] recv()
{
return recv(0);
}

/**
* Receive a message.
*
* @param flags
* the flags to apply to the receive operation.
* @return the message received, as an array of bytes; null on error.
*/
public final byte[] recv(int flags)
{
zmq.Msg msg = base.recv(flags);

if (msg != null) {
return msg.data();
}

mayRaise();
return null;
}

/**
* Receive a message in to a specified buffer.
*
* @param buffer
* byte[] to copy zmq message payload in to.
* @param offset
* offset in buffer to write data
* @param len
* max bytes to write to buffer.
* If len is smaller than the incoming message size,
* the message will be truncated.
* @param flags
* the flags to apply to the receive operation.
* @return the number of bytes read, -1 on error
*/
public final int recv(byte[] buffer, int offset, int len, int flags)
{
zmq.Msg msg = base.recv(flags);

if (msg != null) {
return msg.getBytes(0, buffer, offset, len);
}

return -1;
}

您的代码使用第二个: public final byte[] recv( int flags ){...}
您的代码为其注入(inject)了硬编码的整数值 0 flags 范围。

接下来, int flags API 中的含义更好地记录为:

The flags argument is a combination of the flags defined below:
ZMQ_NOBLOCK
Specifies that the operation should be performed in non-blocking mode. If there are no messages available on the specified socket, the zmq_recv() function shall fail with errno set to EAGAIN.



小心谨慎,可以使用 DONTWAIT 旗内 JeroMQ ,但其他一些有意义的选项很难自下而上地找到。

所以最后,让我们阅读 的ZeroMQ定义和识别集标志 :
// ------------------------------------------------- // Socket options.                                                           
#define ZMQ_HWM 1
#define ZMQ_SWAP 3
#define ZMQ_AFFINITY 4
#define ZMQ_IDENTITY 5
#define ZMQ_SUBSCRIBE 6
#define ZMQ_UNSUBSCRIBE 7
#define ZMQ_RATE 8
#define ZMQ_RECOVERY_IVL 9
#define ZMQ_MCAST_LOOP 10
#define ZMQ_SNDBUF 11
#define ZMQ_RCVBUF 12
#define ZMQ_RCVMORE 13
#define ZMQ_FD 14
#define ZMQ_EVENTS 15
#define ZMQ_TYPE 16
#define ZMQ_LINGER 17
#define ZMQ_RECONNECT_IVL 18
#define ZMQ_BACKLOG 19
#define ZMQ_RECOVERY_IVL_MSEC 20 /* opt. recovery time, reconcile in 3.x */
#define ZMQ_RECONNECT_IVL_MAX 21

// ------------------------------------------------- // Send/recv options.
#define ZMQ_NOBLOCK 1 // <<<<<<<<<<<<<<<<<<<<<<<<<<- THIS ONE IS NEEDED
#define ZMQ_SNDMORE 2

// ------------------------------------------------- // I/O Multplexing options.
#define ZMQ_POLLIN 1
#define ZMQ_POLLOUT 2
#define ZMQ_POLLERR 4

// ------------------------------------------------- // Device types.
#define ZMQ_STREAMER 1
#define ZMQ_FORWARDER 2
#define ZMQ_QUEUE 3

结语:

如果使用 .recv( 0 )您的代码 将阻止 , 直到 socket -实例确实收到任何东西 .recv() - 能够在本地端来自任何,可能存在于某个近期或更远的将来,兼容, .connect() -ed 远程端(一个 REQ 套接字等)。

如果使用 .recv( 1 )您的代码 不会阻塞 ,但应该正确处理两种可能的返回状态 { <msg.data()_Value> | (EXC, NULL) } 并咨询 ZeroMQ errno 详细信息,以便根据发出信号的情境上下文采取行动。

关于matlab - 在 MATLAB 中开始使用 JeroMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39316544/

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