Уведомления

Группа в Telegram: @pythonsu

#1 Май 5, 2011 18:56:06

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки (течёт память)

Здравствуйте,

Поискал тут, и в гугле и чёткого ответа не нашёл поэтому обращаюсь к вам.

Есть демон который периодически запускает очередь заданий (около 100-150ти) в несколько потоков (например в 10 потоков),
как только все потоки выполняют свои задания - демон засыпает на определённое время. - затем всё повторяется.

Почему не крон? - потому что так удобнее, т.к. неизвестно сколько времени будут выполнятся задания. (хотя я понимаю что можно решить эту проблему и при помощи крона)

Так вот, всё работает как и должно за исключением того что через сутки скрипт уже использует 1.5 Гб оперативки - память не освобождается.

Саму очередь делаю при помощи кода: http://code.activestate.com/recipes/577187/

Что я могу в принципе в коде делать не так как нужно? (судя по логам все треды завершают свою работу нормально)

Есть ли какие то рекомендации вообще в какую сторону смотреть?
Или может быть вообще не стоило делать это на потоках, а лучше например сделать через twisted асинхронно.

В общем дайте какую нибудь информацию к размышлению.



Офлайн

#2 Май 5, 2011 20:20:49

cookie-god
От:
Зарегистрирован: 2011-03-13
Сообщения: 41
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки (течёт память)

python memory profiling, узнайте чем заняты 1.5 гб



Офлайн

#3 Май 5, 2011 20:21:18

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Потоки (течёт память)

ThreadPool один раз создаете или периодический?

Офлайн

#4 Май 5, 2011 20:44:23

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки (течёт память)

cookie-god
Спасибо, посмотрю

o7412369815963

Получается при каждом запуске очереди, т.е. раз в сорок минут примерно.


while True:

pool = ThreadPool(concurrency=10)

for num, data in enumerate(srvs): #len(srvs) ~ 150
pool.add_task(run_command, something...)

pool.wait_completion()

sleep(минут на сорок)
Это что получается что питон не чистит весь мусор?
ну т.е. если я делаю
a = 'string'
a = 'string2'
память будет постоянно расти? (хм, надо проверить)
Или эти догадки не имеют ничего общего с реальностью.



Отредактировано (Май 5, 2011 20:48:10)

Офлайн

#5 Май 5, 2011 21:13:02

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Потоки (течёт память)

> Это что получается что питон не чистит весь мусор?
потому что это мусором ещё не является

в каждом цикле создается дополнительно +10 потоков, итого за сутки 24*60/40 * 10 = +360 потоков
pool = ThreadPool(concurrency=10) нужно вынести вне цикла

Офлайн

#6 Май 5, 2011 23:19:04

dll090
От:
Зарегистрирован: 2011-01-22
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Потоки (течёт память)

Да да я уже понял в ошибся, как перепишу, напишу о результате.
Спасибо.


UP

Хотя уже и так понятно было что поможет, но так как обещал - то пишу.

Вобщем вынес эту строку за цикл. 12 часов - 80 Мб.

Ещё раз спасибо.



Отредактировано (Май 9, 2011 18:59:42)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version