Python线程内存泄漏

时间:2018-11-17 05:55:45

标签: python multithreading memory-leaks thread-safety python-multithreading

我有一个这样的班级:

class Detector:
    ...
    def detect:
        sniff(iface='eth6', filter='vlan or not vlan and udp port 53', prn=self.spawnThread, store=0)

    def spawnThread(self, pkt):
        t = threading.Thread(target=self.predict, args=(pkt,))
        t.start()

    def predict(self, pkt):
        # do something
        # write log file with logging module

其中sniff()scapy中的一种方法,对于捕获的每个数据包,它将数据包传递到spawnThread,在spawnThread中,我想创建不同的线程来运行predict方法。

但是似乎有内存泄漏,我检查了Heapy并得到以下输出:

    Partition of a set of 623561 objects. Total size = 87355208 bytes.
 Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
     0 236145  38 26871176  31  26871176  31 str
     1 139658  22 13805832  16  40677008  47 tuple
     2   6565   1  7366648   8  48043656  55 dict (no owner)
     3   1408   0  6592768   8  54636424  63 dict of module
     4  25764   4  3297792   4  57934216  66 types.CodeType
     5  17737   3  3223240   4  61157456  70 list
     6  24878   4  2985360   3  64142816  73 function
     7  14367   2  2577384   3  66720200  76 unicode
     8   2445   0  2206320   3  68926520  79 type
     9   2445   0  2173752   2  71100272  81 dict of type

元组对象的数量和大小一直在增长,我认为这是导致内存泄漏的原因,但我不知道在哪里以及为什么。感谢您的反馈!

更新:如果我不使用线程而直接从predict调用sniff,则不会发生内存泄漏。而且,该类中的其他任何地方都没有其他元组对象。在__init__中,我刚刚启动了一些字符串,例如路径和名称。

class Detector:
    ...
    def detect(self):
        sniff(iface='eth6', filter='vlan or not vlan and udp port 53', 
            prn=self.predict, store=0)

    def predict(self, pkt):
        # do something with pkt
        # write log file with loggin module

0 个答案:

没有答案