PyZMQ如何通过ZeroMQ发送无数据

时间:2018-04-09 09:10:22

标签: null zeromq pyzmq

我的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中这样做。

2 个答案:

答案 0 :(得分:0)

通过ZeroMQ发送空消息的最佳方式是什么?

您的问题被称为需要在所涉及的任何一方采用相同的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
}

我还没有用其他语言测试过,但我觉得这很简单。