【问题标题】:How to IPC between node and python using posix message queue?如何使用posix消息队列在节点和python之间进行IPC?
【发布时间】:2019-11-29 19:44:47
【问题描述】:

我正在尝试在节点 js 和 python3 应用程序之间编写 IPC 的“hello world”。目前,当新消息到达 Python 应用程序时,我遇到了解析错误。代码是:

Python:

from ipcqueue import posixmq
from time import sleep

q1 = posixmq.Queue('/fila1')

while True:

    while q1.qsize() > 0:
        print('p1: Recebi na minha fila: ' + str(q1.get()))

    sleep(0.5)

节点:

const PosixMQ = require('posix-mq')

var mq = new PosixMQ();
mq.open({
    name: '/fila1',
    create: true,
    mode: '0777',
    maxmsgs: 10,
    msgsize: 11
});
mq.push("hello world")
mq.close();

当第二个应用发送消息时,python 应用失败并显示:

文件“../test-fila1.py”,第 9 行,在

print('p1: Recebi na minha fila: ' + str(q1.get()))   File "/usr/lib/python3.7/site-packages/ipcqueue/posixmq.py", line 174, in

得到

return self._serializer.loads(data)   File "/usr/lib/python3.7/site-packages/ipcqueue/serializers.py", line 14,

加载中

return pickle.loads(data) KeyError: 101

[2]- 退出 1 python3 ../test-fila1.py [3]+ 完成节点 index.js

编辑
因此,我决定将问题从“KeyError: 101 when loading ipc message between node and python apps”更改为“How to IPC between node and python using posix message queue?”因为我刚刚注意到我发布的示例代码每次运行时都会产生不同的错误。现在发生的错误是(但是,没有更改任何代码):

Traceback(最近一次调用最后一次):文件“sn-ps/test-fila1.py”,
第 9 行,在
print('p1: Recebi na minha fila: ' + str(q1.get())) 文件“/usr/lib/python3.7/site-packages/ipcqueue/posixmq.py”,第 174 行,在
得到
返回 self._serializer.loads(data) 文件“/usr/lib/python3.7/site-packages/ipcqueue/serializers.py”,第 14 行,
在负载中
返回 pickle.loads(数据)
_pickle.UnpicklingError: unpickling 堆栈下溢

【问题讨论】:

  • 尝试从 node.js 发送一个对象而不是原始字符串,例如mq.push({'data': 'hello world'});
  • 函数不接受:TypeError: First argument must be a node::Buffer or v8::String
  • 尝试对 JSON 对象消息进行字符串化。例如message = {'data': 'hello world'} mq.push(JSON.stringify(message))
  • 是的,它也会导致发生相同的错误:_pickle.UnpicklingError: invalid load key, '{'

标签: python node.js posix ipc mqueue


【解决方案1】:

如果您查看Queue 中的__init__

class Queue(object):
    """
    POSIX message queue.
    """

    def __init__(self, name, maxsize=10, maxmsgsize=1024, serializer=PickleSerializer):

您可以看到默认的serializerPickleSerializer,这意味着它假定队列中的数据是腌制的,而您从nodejs 发送原始数据。修复很简单,使用RawSerializer

from ipcqueue import posixmq
from time import sleep
from ipcqueue.serializers import RawSerializer
q1 = posixmq.Queue('/fila1', serializer=RawSerializer)

while True:

    while q1.qsize() > 0:
        print('p1: Recebi na minha fila: ' + str(q1.get()))

    sleep(0.5)

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 2020-10-30
    • 2012-08-05
    • 2020-11-27
    • 2020-06-11
    • 1970-01-01
    • 2013-01-05
    • 2012-09-19
    • 2021-03-12
    相关资源
    最近更新 更多