Я написал около 50 классов, которые я использую для подключения и работы с веб-сайтами с использованием механизации и потоков.Все они работают одновременно, но они не зависят друг от друга.Так что это означает 1 класс - 1 сайт - 1 поток.Это не очень элегантное решение, особенно для управления кодом, так как большая часть кода повторяется в каждом классе (но этого недостаточно, чтобы превратить его в один класс для передачи аргументов, поскольку некоторые сайты могут требовать дополнительной обработки извлеченных данных в середине методов- как «логин» - что другим может не понадобиться)Как я уже сказал, это не элегантно, но работает.Само собой разумеется, я приветствую все рекомендации, как написать это лучше, не используя 1 класс для каждого подхода веб-сайта.Добавление дополнительной функциональности или общего управления кодом каждого класса является непростой задачей.
Однако я обнаружил, что каждый поток занимает около 8 МБ памяти, поэтому при 50 работающих потоках мы рассматриваем использование около 400 МБ.Если бы он работал в моей системе, у меня не было бы проблем с этим, но, поскольку он работает на VPS только с 1 ГБ памяти, это становится проблемой.Можете ли вы сказать мне, как уменьшить использование памяти, или есть ли другой способ работать с несколькими сайтами одновременно?
Я использовал эту программу быстрого тестирования Python, чтобы проверить, хранятся ли данные в переменных моего приложениякоторый использует память или что-то еще.Как видно из следующего кода, он обрабатывает только функцию sleep (), но каждый поток использует 8 МБ памяти.
from thread import start_new_thread
from time import sleep
def sleeper():
try:
while 1:
sleep(10000)
except:
if running: raise
def test():
global running
n = 0
running = True
try:
while 1:
start_new_thread(sleeper, ())
n += 1
if not (n % 50):
print n
except Exception, e:
running = False
print 'Exception raised:', e
print 'Biggest number of threads:', n
if __name__ == '__main__':
test()
Когда я запускаю это, вывод:
50
100
150
Exception raised: can't start new thread
Biggest number of threads: 188
И, удалив строку running = False
, я могу затем измерить свободную память с помощью команды free -m
в оболочке:
total used free shared buffers cached
Mem: 1536 1533 2 0 0 0
-/+ buffers/cache: 1533 2
Swap: 0 0 0
Фактический расчет, почему я знаю, что он занимает около 8 МБ на поток, тогда просто делитсяделение разницы памяти, использованной до и во время выполнения вышеуказанного тестового приложения, деленное на максимальное количество потоков, которое ему удалось запустить.
Вероятно, это только выделенная память, потому что, глядя на top
, процесс python используеттолько около 0,6% памяти.