Я написал около 50 классов, которые я использую для подключения и работы с веб-сайтами с использованием механизации и потоковой передачи. Все они работают одновременно, но не зависят друг от друга. Это означает, что 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% памяти.