Python 在Linux上从外部进程进行管道传输时使用pika/rabbitmq时内存泄漏
所以在过去的两天里,我一直在努力解决一个无法解释的问题 我的目标是使用tshark(命令行Wireshark)侦听通信量并将数据包转换为XML格式,然后通过rabbitmq将这些XML数据包转发给另一个工作者 这是我的代码:Python 在Linux上从外部进程进行管道传输时使用pika/rabbitmq时内存泄漏,python,linux,memory-leaks,rabbitmq,pika,Python,Linux,Memory Leaks,Rabbitmq,Pika,所以在过去的两天里,我一直在努力解决一个无法解释的问题 我的目标是使用tshark(命令行Wireshark)侦听通信量并将数据包转换为XML格式,然后通过rabbitmq将这些XML数据包转发给另一个工作者 这是我的代码: #!/usr/bin/env python from subprocess import Popen, PIPE import pika def main(): tshark_process = Popen(['/usr/bin/tshark', '-i', '
#!/usr/bin/env python
from subprocess import Popen, PIPE
import pika
def main():
tshark_process = Popen(['/usr/bin/tshark', '-i', 'eth0', '-T', 'pdml'],
stdout=PIPE ,
shell=False)
message= []
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
channel.queue_declare(queue="packets", durable=True)
for line in tshark_process.stdout:
if "<packet>" in line:
message = []
if "</packet>" in line:
message.append(line)
full_message = "".join(message)
channel.basic_publish(exchange='',
routing_key="packets",
body=full_message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))
message = []
else:
message.append(line)
if __name__ == '__main__':
main()
#/usr/bin/env python
从子流程导入Popen、PIPE
进口鼠兔
def main():
tshark_process=Popen(['/usr/bin/tshark','-i','eth0','-T','pdml'],
stdout=管道,
外壳=假)
消息=[]
connection=pika.BlockingConnection(pika.ConnectionParameters(“localhost”))
channel=connection.channel()
channel.queue\u declare(queue=“packets”,durable=True)
对于tshark_process.stdout中的管线:
如果行中有“”:
消息=[]
如果行中有“”:
message.append(行)
完整消息=“加入(消息)
channel.basic_发布(exchange=“”,
路由_key=“数据包”,
正文=完整信息,
属性=pika.BasicProperties(
传递模式=2,#使消息持久化
))
消息=[]
其他:
message.append(行)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
工作人员实际上可以看到数据包,而且看起来很棒。但是当我运行命令“top”时,我可以看到tshark进程内存使用率一直在增加(大约每秒200k)。过了一段时间,由于内存已满,python程序因内存错误而崩溃
这听起来像是一个切克问题,对吗
好吧,当单独运行tshark时,内存使用在1-2秒后就稳定在一个非常低的数字上,并且在那之后永远不会上升
如果我评论“channel.basic_publish”行,同样的事情,这个问题就会消失
我真的被这个问题弄糊涂了,尤其是当内存泄漏来自第三方进程时,不应该以这种方式受到影响
我真的希望有人能为我解释这个问题,甚至为我指明方向
谢谢,
戴夫