У меня есть такой класс:
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