Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Linux上从外部进程进行管道传输时使用pika/rabbitmq时内存泄漏_Python_Linux_Memory Leaks_Rabbitmq_Pika - Fatal编程技术网

Python 在Linux上从外部进程进行管道传输时使用pika/rabbitmq时内存泄漏

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', '

所以在过去的两天里,我一直在努力解决一个无法解释的问题

我的目标是使用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', '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”行,同样的事情,这个问题就会消失

我真的被这个问题弄糊涂了,尤其是当内存泄漏来自第三方进程时,不应该以这种方式受到影响

我真的希望有人能为我解释这个问题,甚至为我指明方向

谢谢, 戴夫