Fab*_*otk 2 python posix ipc node.js mqueue
我正在尝试在节点 js 和 python 3应用程序之间编写 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)
Run Code Online (Sandbox Code Playgroud)
节点:
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();
Run Code Online (Sandbox Code Playgroud)
当第二个应用程序发送消息时,python 应用程序失败并显示:
文件“../test-fila1.py”,第 9 行,在
Run Code Online (Sandbox Code Playgroud)print('p1: Recebi na minha fila: ' + str(q1.get())) File "/usr/lib/python3.7/site-packages/ipcqueue/posixmq.py", line 174, in得到
Run Code Online (Sandbox Code Playgroud)return self._serializer.loads(data) File "/usr/lib/python3.7/site-packages/ipcqueue/serializers.py", line 14,在负载
Run Code Online (Sandbox Code Playgroud)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?” 因为我刚刚注意到我发布的示例代码每次运行时都会产生不同的错误。现在发生的错误是(但是,没有更改代码):
回溯(最近一次调用最后一次):文件“snippets/test-fila1.py”,
第 9 行,在
print('p1: Recebi na minha fila: ' + str(q1.get())) 文件“/usr/lib /python3.7/site-packages/ipcqueue/posixmq.py", line 174, in
get
return self._serializer.loads(data) File "/usr/lib/python3.7/site-packages/ipcqueue/serializers.py ",第 14 行,
在负载中
返回 pickle.loads(data)
_pickle.UnpicklingError: unpickling stack underflow
如果你看__init__的Queue
class Queue(object):
"""
POSIX message queue.
"""
def __init__(self, name, maxsize=10, maxmsgsize=1024, serializer=PickleSerializer):
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,默认serializer值为PickleSerializer,这意味着它假设队列中的数据是pickle 的,而您从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)
Run Code Online (Sandbox Code Playgroud)