Утечка памяти в потоках Python - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть такой класс:

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 , для каждого захваченного пакета он передает пакет spawnThreadspawnThread я хочу создать разные потоки для запуска 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
...