Как уменьшить использование памяти многопоточным кодом Python?

Я написал около 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% памяти.

7
задан Gargauth 10 January 2012 в 00:06
поделиться