|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Victor Wagner 2:5020/400 10 Apr 2003 17:06:19 To : Oleg Ivanenko Subject : Re: mod_perl: parallel requests -------------------------------------------------------------------------------- Oleg Ivanenko <ash@aska.com.ua> wrote: OI> То есть, другими словами, даже если моя программа не делает ликов, их OI> может делать еще что-то (mod_perl, apache etc) и поэтому лучше от греха OI> подальше время от времени прибивать экземпляры mod_perl выполняющего мой OI> код? Hе шаманство ли это? Hе шаманство. Это честное заметание мусора под ковер. Шаманство это когда для того, чтобы заработало электричество нужно спуститься в подвал и постучать по водопроводной трубе. Причем связи между неработой электричества и водопроводной трубой никто объяснить не может. Здесь же причинно-следственная связь очевидна: мы знаем что программа пухнет со временем. Поэтому чтобы она не пухла слишком сильно, мы ограничиваем срок ее жизни. Это скорее можно назвать симптоматическим лечением. OI> Возможно я некорректно выразился. Под словом "программа" я понимаю OI> выполняемый операционной системой код написанный программистом. Обрати внимание, что Registry-скрипты выполняются ни разу не операционной системой, а собственно модперловым апачем, который их читает как обычные текстовые файлы, мало-мало переписывает и передает встроенному интерпретатору перла как строки, содержащие перловый код. Программа это все-таки то, что запускается на выполнение системным вызовом exec. OI> Под словом "заглушка" я понимал сгенерированный mod_perl код для OI> выполнения внутри себя моей программы. По английски это можно назвать OI> stub. Так вот, представь себе ситуацию, что до аварийного завершения OI> моей программы внутри пресловутой "заглушки" я имею в памяти 20 объектов OI> некоего класса. После того, как программа аварийно завершилась, эти OI> объекты остаются в памяти "заглушки", вследствие, циклических ссылок, Hе в памяти заглушки, а в памяти интерпретатора perl. OI> которые ты приводишь в пример ниже по тексту и уничтожаются только Плохо тебе. Перепиши код следующим образом: eval { #твой код который может аварийно завершиться }; if ($@) { #он таки завершился аварийно #Чистим все объекты некоего класса MyClass::DestroyAll(); } Остается придумать как написать этот самый DestroyAll Можно например так - в конструкторе ты помещаешь ссылку на объект в некоторый глобальный для класса (our) хэш. В деструкторе (который вызывается явно при нормальной работе, так как циклические ссылки там все равно есть) - оттуда ее прибиваешь. А DestroyAll идет по values этого хэша и для всего что там найдет вызывает деструктор. OI> Я знаю, о преимуществах ООП и поэтому в perl все пишу КЛАССАМИ. Я OI> убедился на собственном опыте в опасностях, которые подстерегают OI> поклонников глобальных переменных. Вышеописанный случай как раз один из немногих, где глобальные переменные полезны. -- --- ifmail v.2.15dev4 * Origin: Free Net of Leninsky,45 (2:5020/400) Вернуться к списку тем, сортированных по:
Архивное /ru.cgi.perl/1517853b425a9.html, оценка из 5, голосов 10
|