Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Многопоточность,потоки зависают и "поедают" память |
Автор: StealtH 3.9.2007, 09:57 | ||||
Есть код:
Суть проблемы такова, что потоки не умирают должным образом и остаются в памяти, с учетом того, что в среднем каждый поток весит примерно 10 метров, то на 300-350 итерации цикла на сервере не остается оперативки, а 400 итераций - это даже не 1% файла. Господа, помогите разобраться в чем проблема, уже который день бьюсь а результата - ноль. OS - ASPLinux 10
|
Автор: Bulat 5.9.2007, 08:24 | ||
StealtH, с многопоточностью работаю через fork, но думаю что в этом моенте разницы не будет. Для того чтобы убивать зомби использую
|
Автор: fray 5.9.2007, 13:04 | ||
Работать с тредами нужно очень аккуратно. Так как они капризные и могут возникать разные "эффекты" с памятью сделай хотяб так...
вот так ! потом зачем передавать $words[$j] ведь на то они и треды чтобы находится в одной области памяти к родителю сделай так чтобы, элемены массива выбирались прям в сабе, хотя конечно мож я забыл что ты спрашивал. |
Автор: StealtH 6.9.2007, 22:51 |
Bulat, помогло, но не совсем, памяти стали потоки съедать меньше, но все же остается момент когда они ее поедают, постепенно объем занимаемой памяти растет :( fray, насчет юзать переменные прямо в сабе - хорошая мысль, попробовал, мне понравилось ![]() |
Автор: StealtH 15.9.2007, 20:14 |
Bulat, в "детях" происходит банальное скачивание контента, далее удаление тэгов и индексация по уникальным словам с подсчетом повторений в слов в тексте, т.е. прога по сути своей поисковый паук, была проблема с памятью, в среднем поток "весил" порядка 10-12 метров, но потом я отказался от LWP и переписал все на сокеты, в самой подпрограмме, из которой делается поток все переменные уничтожаются по мере их использования, старался оптимизировал код как мог, но все-таки остается проблема с зависшими процессами, количество которых накапливается, и соответственно количество свободной памяти уменьшается. Вот собственно и сама проблема, решения пока найти не могу. |
Автор: Bulat 1.10.2007, 14:51 |
У меня подобное было, но после оптимизации кода, я снизил до 9-10, немного конечно, но пара мегобайт умноженные хотя бы на 10 дочерних процессов уже ~20. я не стал отказыватся, видел как работают и на простых сокетах и с ЛВП, как-то не показалось, что настолько уж лучше ![]() значит что-то не так с твоим кодом, после вышеприведенного куска кода, отработавшие свое дочерние процы не должны зависать. У меня код был написан так, что одновременно могли работать не более 10 дочерних процессов. Возможно, где-то у тебя происходит, что дочерние потоки порождают новые??? Не знаю, если ты нормально убиваешь дочерние процы, после этого еще и нормально убиваешь зомби, зависать не должны ![]() |
Автор: G0rinich 2.10.2007, 10:43 |
http://poe.perl.org/ спасет мир ![]() Это если работаете с http://gorinich.net/posts/12. Добавлено через 7 минут и 37 секунд http://forum.vingrad.ru/index.php?showtopic=124167&view=findpost&p=1081025 можно посмотреть пример хорошего такого паучка. Код конечно приведен для примера. Оптимизированный такой скрипт на самописных "боевых" компонентах способен выжимать 100 - 1К запросов в секунду ;) |