【发布时间】:2021-01-28 17:39:20
【问题描述】:
我正在开发一个与内核模块连接的应用程序。对于这种通信,我在 python 中使用 netlink libnl3.5.0,它使用 swig 将“c”包装到 py 中。问题是当我尝试进行多处理并尝试将 msg 队列共享给不同的进程时。 Python 无法腌制/序列化 SwigPyObject 格式的消息。
我试图找到这个对象的高级类实现,但我很困惑。看到其他帖子说要在对象中实现一些 getstate 和 reduce 函数,但我不明白在哪里使用它。
尝试过 dill 包,但我猜 dill 正在使用 pickle 进行底层实现。所以这会返回同样的错误。
下面是我实现的主要部分
def queue_packet(msg,args):
global a
nlh=nl.nlmsg_hdr(msg)
ghdr=genl.genlmsg_hdr(nlh)
if(ghdr.cmd==2):
_,attr=genl.py_genlmsg_parse(nlh,0,8,None)
a.put(attr)
#print(a.qsize())
return 0
def worker(a):
print("worker started")
while True:
if a.qsize()==0:
continue
attr=a.get()
process_messages_cb(attr)
a.task_done()
return 0
a=multiprocessing.Manager.Queue()
while 1:
nl.nl_recvmsgs(s,rx_cb)
这是接收消息并将消息放入队列的主要部分。并且不同的工作人员将从队列中获取消息并进一步处理它们。那么如何将消息放入队列以在不同的工作人员/子进程之间共享。 我正在使用这个https://github.com/thom311/libnl/tree/master/python API。
谢谢
【问题讨论】:
标签: pickle python-multiprocessing swig netlink dill