我的PubSub网络中的第一个节点正在读取.csv文件,并逐行转发数据作为多部分消息。发送最后一行后,我想发送一条带None
的最终消息,向我的网络其余部分表明我们已完成。
E.g。邮件信封:pub.send_multipart(['some_topic'.encode('ascii'), None])
但是,如果我尝试发送它,我会收到以下错误:
TypeError('Frame 1 (None) does not support the buffer interface.',)>
Traceback (most recent call last):
File "/*path*/anaconda3/envs/zeromq/lib/python3.6/site-packages/zmq/sugar/socket.py", line 426, in send_multipart
memoryview(msg)
TypeError: memoryview: a bytes-like object is required, not 'NoneType'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "pub_facs.py", line 165, in facs_pub
await pub.send_multipart([sub_key.encode('ascii'), None, None, None, None])
File "/*path*/anaconda3/envs/zeromq/lib/python3.6/site-packages/zmq/_future.py", line 445, in _handle_send
result = send(msg, **kwargs)
File "/*path*/anaconda3/envs/zeromq/lib/python3.6/site-packages/zmq/sugar/socket.py", line 433, in send_multipart
i, rmsg,
TypeError: Frame 1 (None) does not support the buffer interface.
当然,我可以将它设置为类似['some_topic', -1]
的东西,但是如果我想用另一种编程语言(例如C#)进行自动对象分配,那么将数据设置为null
会有效,但是-1不是,如果该变量未初始化为整数。
通过ZeroMQ(PyZMQ)发送空消息的最佳方法是什么?我能以某种方式发送一个空的消息帧吗? ZeroMQ指南讲述zmq_msg_init()
在C中创建一个空消息,但我不知道如何在Python中这样做。
答案 0 :(得分:0)
您的问题被称为需要在所涉及的任何一方采用相同的SER / DES策略。
ZeroMQ不是因此类问题而受到指责的部分。
如果您选择的语言绑定(PyZMQ)不允许处理和发送 None
数据类型,您的下一步可能会通过 import struct
< / strong>和撰写
根据您自己的位/字节映射政策, struct.pack( aDateTypeSpecificMASK, aDataToSEND )
/解码数据类型 struct.unpack( aDateTypeSpecificMASK, aDataJustRECVd )
(这可能听起来费力,但仅限于一个&# 39;第一眼看到你对任何一个远程终端客户生态系统保持绝对控制权,这是最强大的选择,不是吗?)
ZeroMQ将&#34;随身携带&#34;位/字节映射的有效负载没有任何干预。那很简单。
答案 1 :(得分:0)
我找到了一种简单的方法来发送&#34;无&#34;消息:b''
(空字节字符串),例如Python&gt; = 3.5(asyncio):
# send None message
await pub.send_multipart([sub_key.encode('ascii'), b'', b''])
# receive None message
msg = await sub.recv_multipart()
if msg[1]:
# do stuff with message
else:
print("Message is empty")
使用C#:
if (!subSocket.TryReceiveFrameString(out topic)) continue;
if (!subSocket.TryReceiveFrameString(out data1)) continue;
if (!subSocket.TryReceiveFrameString(out data2)) continue;
if (data1 != "")
{
// Do message stuff
}
我还没有用其他语言测试过,但我觉得这很简单。