Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Резидентная программа на Перл? 
:(
    Опции темы
Wowa
  Дата 6.12.2005, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Мне нужно написать программу, которая постоянно подключалась бы к удаленной БД, получала данные и обрабатывали бы дальше, если в БД есть новые записи.


Как реализовать, чтобы программа вечно работала? Т.е. чтобы процесс не умирал?
PM WWW   Вверх
Kannabismus
Дата 7.12.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Тим Тоуди



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.11.2005

Репутация: 1
Всего: 2



Код

while(1)
{

}


Для отсоединения от терминала можно юзать Proc::Daemon для *nix и PDK от Activestate под windows.

Это сообщение отредактировал(а) Kannabismus - 7.12.2005, 00:11
PM   Вверх
Sadok
Дата 7.12.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Kannabismus
100% загрузка компа в итоге
PM   Вверх
Kannabismus
Дата 7.12.2005, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Тим Тоуди



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.11.2005

Репутация: 1
Всего: 2



Необязательно, это зависит от кода в while.

Это сообщение отредактировал(а) Kannabismus - 7.12.2005, 16:15
PM   Вверх
Sadok
Дата 8.12.2005, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: 1
Всего: 2



Kannabismus
Цитата
Необязательно, это зависит от кода в while

# perl -e 'while (1) { print "1\n";};'
и смотрим в top -tI, как плавно perl и sshd (я через терминал) хором отжирают ресурсы. Без sleep() не обойтись

PM   Вверх
sharq
Дата 9.12.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Wowa можно сделать просто скрипт, который выполнил свои действия и выгрузился, но он будет запускаться по cron'у через определенное время. Только нужно будет при повторном запуске проверять - не работает ли данный скрипт (если он не успел выполнить предписанные действия).

Плюс: загрузка процессора будет меньше.

smile

Это сообщение отредактировал(а) sharq - 9.12.2005, 15:51


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Kiber_rat
Дата 9.12.2005, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Wowa Если речь иде о *nix, то тебе можно написать демон (подробности можно прочитать в главе 17.17 Perl Cookbook), хотя то что предложил sharq проще. Пишешь скрипт который обращается к БД, если данные есть - что-то с ними делает, если нет - умирает. Запихиваешь его в cron и вызываешь с нужной периодичностью. Если каждую минуту достаточно, то решение тебя устроит, если надо чаще, то можно в самом скрипте сделать цикл со слипом перед каждой итерацией, используя Time::HiRes можно хоть каждую сотую секунды проверять наличие данных,а запускать скрипт с &.
Например так:
Код
#!/usr/bin/perl;
use strict;
use warnings;
$|=1; # Это что бы sleep нормально работал...
while (1) {
    print "Find data! :)\n" if -e '/tmp/boo';
    exit if -e '/tmp/end';
    sleep 1;
}
называем это дело testdaemon.pl и запускаем так:
Код
testdaemon.pl  &
Теперь если создать в /tmp файл boo то в консоль получим Find data! smile и будем его получать пока не удалим /tmp/boo, а если там создать end то скрипт закончит работу. При этом никакой особой нагрузки на проц/память не будет...

Это сообщение отредактировал(а) Kiber_rat - 9.12.2005, 19:17


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Usya
Дата 10.12.2005, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Kiber_rat правильно сказал, что все зависит от частоты обращений, хотя на счет каждой минуты м/б погорячился. Это возможно, но следует учесть, что

Цитата
... При обращении к скрипту, Апаче загружает интерпретатор, а тот выполняет код. При этом тратится довольно много памяти. Не менее 2 мегабайт на каждый процесс. Обычно от 4 до 6 мегабайт. Выходит, что каждый раз при обращении к скрипту сервер производит загрузку тяжелой программы - интерпретатора. Но это не значит, что Перл-скрипты выполняются медленнее. Это значит, что при работе с Perl сервер испытывает большую нагрузку.

При больших нагрузках получаем следующее: сервер, использующий PHP легче справляется с запросами и может обработать больше клиентов. В то время сервер с сайтами на Perl будет подтормаживать.

Ситуация легко разруливается следующим образом (mod_perl не понравился сразу, памяти много жрет, я о нем говорить не буду): на сервер с Perl ставится прекрасный модуль fast_cgi (http://fastcgi.com). Он позволяет существенно снять нагрузку с сервера за счет того, что после первого запуска скрипт не выгружается из памяти, а ждет следующий запрос. При этом скрипт будет работать столько, сколько нужно, оставаясь в памяти. Никакой лишней нагрузки на ресурсы сервера. Та же идея, что лежит в основе PHP.

Простые CGI-скрипты отличаются от FastCGI-скриптов всего несколькими строчками да и структурой. Например, скрипт может при первом запуске соединиться с MySQL и постоянно держать это соединение. Для того, чтобы скрипт работал именно под управлением FastCGI вызывается библиотека FCGI. Она легко ставится под Linux или Unix.
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
…
Действия, выполняемые при инициализации
скрипта (например, коннект к БД)
…
while($request->Accept() >= 0)
{
…
Основные действия, которые должен выполнять скрипт
…
}
…
Действия при завершении (редко нужно)
…

При выполнении запросов скрипт как бы гоняется по циклу: ожидание - обработка - ожидание - обработка. В реале (под Linux или Unix) это спящий процесс, который находится в режиме Accept.

Если запросов очень много, то сервер может запустить еще копию процесса. Это жрет некоторое количество памяти, но в целом увеличивает производительность сервера и ведет к экономии ресурсов.

http://lib.protoplex.ru/lib_show/45.html
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Kiber_rat
Дата 10.12.2005, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Usya информация безусловно полезная, но smile Во первых, пример скрипта который я привел ОДИН раз загружается в память и там висит, можно кой чего там доделать что-бы получился честный демон, во вторых, а с чего ты взял что требуемый скрипт это именно CGI? Я из вопроса Wowa этого не увидел. Perl, в отличии от PHP, это не WEB ориентированный язык, на нем пишется и куча системных скриптов. А вобще за мысль спасибо, возможно Fast_cgi действительно полезная штука, но надо потестить, посравнивать и посмотреть что о нем слышно на security сайтах ;)


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Wowa
Дата 10.12.2005, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(Kiber_rat @ 10.12.2005, 09:08)
требуемый скрипт это именно CGI?

Хм.. Ну запускать его через веб-сервер смысла вроде нет. Мне нужно запустить скрипт или один раз в ввиде демона или с некой регулярностью через Крон. Чаще, чем раз в минуты смысла делать нет. Хватит вполне запуска одного раза в минуту.

Я боюсь просто, что скрипт не успеет справиться за минуту с работой, а через крон уже будет запускать след. экземплят скрипт, хотя конечно можно создавать какой-нибудь .lock файл. Для блокировки след. запуска, если этот еще не отработал. Это вроде хороший вариант.

Второй вариант. Это все же организовать демон. Который проверяет таблицу на удаленном сервере. Если в ней есть новые записи, то он начинает их обрабатывать. Или нет,то ждет некоторое время и снова проверяет таблицу на удаленном сервере. И так по кругу...

Внимание вопрос! smile Какие преимущества и недостатки, если организовать сие через КРОН или же ввиде демона(название нехорошее smile ) ? Как лучше?

Я склоняюсь к реализации через КРОН больше.
PM WWW   Вверх
Wowa
Дата 10.12.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Тут еще кое-что по этой теме: http://forum.vingrad.ru/index.php?act=ST&f...=73854&unread=1
О том, что выбрать лучше для этого задачи Perl или PHP ?
PM WWW   Вверх
sharq
Дата 10.12.2005, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Wowa я считаю, что лучше это организовать через cron, и ресурсов будет меньше тратиться и проще будет реализовать. smile

Цитата(Wowa @ 10.12.2005, 13:25)
Я боюсь просто, что скрипт не успеет справиться за минуту с работой, а через крон уже будет запускать след. экземплят скрипт, хотя конечно можно создавать какой-нибудь .lock файл. Для блокировки след. запуска, если этот еще не отработал. Это вроде хороший вариант.

Именно так. Или проверять процессы на наличие твоего скрипта.

Цитата(Wowa @ 10.12.2005, 13:25)
Второй вариант. Это все же организовать демон. Который проверяет таблицу на удаленном сервере. Если в ней есть новые записи, то он начинает их обрабатывать. Или нет,то ждет некоторое время и снова проверяет таблицу на удаленном сервере. И так по кругу...

Этот вариант тоже хорош, но у тебя будет
Код

while (1) {
  ...
  exit if ...;
}

А это будет сильно грузить процессор. Хотя если это не проблема, то можно и демона создать.


Цитата(Wowa @ 10.12.2005, 13:35)
что выбрать лучше для этого задачи Perl или PHP ?

Определенно perl!

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Wowa
Дата 10.12.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(sharq @ 10.12.2005, 10:55)
Определенно perl!

Почему?
PM WWW   Вверх
sharq
Дата 10.12.2005, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Wowa
Цитата(Wowa @ 10.12.2005, 13:57)
Цитата (sharq @ 10.12.2005, 10:55)
Определенно perl!

Почему?


Потому что я люблю и пишу на perl.
Сильный аргумент? smile

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Wowa
Дата 10.12.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Цитата(sharq @ 10.12.2005, 13:16)
Сильный аргумент?

больше похоже на оффтоп ;)
PM WWW   Вверх
Kiber_rat
Дата 10.12.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Так, выскажусь по всем пунктам. Во первых, perl лучше потому, что PHP это WEB ориентированный язык и хорош только для WEB, для системных скриптов намного лучше perl и по скорости и по гибкости и по степени интеграции с системой. Далее, что касается cron или demon. Я за demon, потому что это правильнее. Объясню почему. Во первых крон это стороннее приложение и им управляешь не ты а админ машины, в случае если демон крона отвалится твой скрипт не отработает, в случае перевода системного времени он тоже может проглючить. Демон - твое приложение, ты его полностью контролируешь, он грузит систему не больше чем твой скрипт в кроне, а то и меньше. Аргументы привел Usya. При запуске через крон у тебя каждый раз будет запускаться интерпритатор в котором уже будет выполнятся твой скрипт, в демон будет висеть в памяти постоянно и дополнительных накладных расходов не потребует. Главное поставить sleep smile То что правильно написанный демон будет есть многоресурсов это голословное утверждение, можем написать оба варианта и потестить.
Код
#!/usr/bin/perl
# Создание демона
use POSIX qw(setsid);
fork && exit;
setsid();
fork && exit;
open F, "<&=$_" and close F for 3 .. 254;
# Наш "полезный" код
$|=1; # Это что бы sleep нормально работал...    
while (1) {    
    print "Find data! :)\n" if -e '/tmp/boo';    
    exit if -e '/tmp/end';    
    sleep 1;    
}
Вот что-то такое...


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Usya
Дата 11.12.2005, 00:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Wowa, на счет того, что лучше для этого задачи Perl или PHP - то, в чем лучше разбираешься smile Потому что есть свои тонкости и в том и в этом, которые позволят оптимизировать код. Обычно, насколько я знаю, в основном загоняются на каком-то одном языке, а остальные изучают для эрудиции... Кстати, название той статьи, на которую я дал ссылку - как раз о сравнении PHP и Perl. А если серьезно, то надо самому пробовать писать на том и том и сравнивать, потому что помимо получения данных, как ты написал, прога должна их и обрабатывать. В свое время меня интересовал вопрос о том, что лучше. На разных форумах видел примеры тестовых кодов, выполняющих одно и тоже с результатами по продолжительности работы. В одних случаях Perl-овские скрипты были на первом месте, в других PHP-шные. Кстати, можешь сам через поисковик посмотреть - достаточно много инфы, правда порой встречаются противоречивые мнения. Я и сам за Perl, хотя думаю, что на PHP-шном форуме тебе будут говорить, что они "за" PHP и приводить соответствующие аргументы, хотя с тем, что сказал Kiber_rat, - "PHP это WEB ориентированный язык и хорош только для WEB" - не поспоришь.
Кстати, и еще: Kiber_rat привел ряд аргументов в пользу демона. Единственное, надо учесть, что у некоторых хостеров есть ограничение на время выполнения скриптов. А в общем, если скрипт достаточно часто запускать, как ты пишешь (раз в минуту), то я тоже против cron-а, хотя через cron мне кажется проще (возможно потому что демонов не создавал - не было необходимости).

Kiber_rat
Цитата
..., а с чего ты взял что требуемый скрипт это именно CGI?

Я привел цитату только для того, чтобы пояснить, что частый запуск Perl-овских скриптов загружает сервер (обрезать статью сильно не стал, т.к. там было еще немного полезной инфы). Кстати, на счет поработать с FastCGI - не на всех серваках есть... Честно говоря, я и сам с ним не работал... Хотел, да немного обламался, как раз именно по приведенной выше причине...
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Wowa
Дата 11.12.2005, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
Group Icon


Профиль
Группа: Админ
Сообщений: 15017
Регистрация: 14.9.2000
Где: Винград

Репутация: нет
Всего: 290



Проект масшатбный, поэтому сервер для него естественно свой - отдельный.
PM WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.