powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plperlu снять процесс
7 сообщений из 7, страница 1 из 1
plperlu снять процесс
    #38583601
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа перловшики, есть фанкшн, на перле, опрашивает уеб-сервис. В норме, если сервис тормозит или плохо доступен, по таймауте http[s] отваливается через 3 минуты. Но если с сетью нелады - виснет (безответно). Процесс постгреса, её ждущий, не кладется ни pg_cancel_backend ни pg_terminate_backend. [ В случае dblink поведение такое же, но там я могу найти среди процессов postgres-а процесс, запущенный через dblink, и его положить. тогда и вызывающий очнётся.]

А как быть с перлом ? как (в системе) найти процесс, который надо положить, чтобы вызвавший его postgres попустило ?

это возможно ?
или я бред несу ?


PS как и можно ли в перле контролировать выполнение нити ? семафоры там понавставлять? таймауты свои прикрутить ? Есть примеры ?
...
Рейтинг: 0 / 0
plperlu снять процесс
    #38583772
Dstbl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если http опрашивается через LWP, то там есть настройка таймаута.
В общем случае, можно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
do language plperlu $PERL$
####### заводим будильник
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 10; # в секундах
####### длительная обработка
use LWP::UserAgent;
warn LWP::UserAgent->new->get('http://127.0.0.1:3000/slowpoke')->content;
####### отрубаем будильник
alarm 0;
$PERL$;
...
Рейтинг: 0 / 0
plperlu снять процесс
    #38583815
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DstblЕсли http опрашивается через LWP, то там есть настройка таймаута.
В общем случае, можно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
do language plperlu $PERL$
####### заводим будильник
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 10; # в секундах
####### длительная обработка
use LWP::UserAgent;
warn LWP::UserAgent->new->get('http://127.0.0.1:3000/slowpoke')->content;
####### отрубаем будильник
alarm 0;
$PERL$;



у меня было:
Код: php
1.
2.
my $ua = LWP::UserAgent->new;
$ua->timeout(21);


потом выяснилось, что ssl-хендшейку на timeout положить с прибором.
накопал где-то в интеах такую шняжку:
Код: php
1.
2.
3.
4.
5.
6.
7.
###-- 2014-02-20 ??? https://metacpan.org/pod/IO::Socket::SSL
$ua->ssl_opts(timeout  => 21,  Timeout  =>21);

$ua->ssl_opts(
		SSL_use_cert => 1,
		SSL_cert_file	=>	$ssl_cert_file);
$ua->ssl_opts(SSL_key_file	=>$ssl_cert_file);


но, судя по всему, это не мой случай.


а "будильник" порождает отдельный поток и семафоры в ём ?
где это почитать?


PS поставил в тесте
alarm 0.001; - не порвало.
...
Рейтинг: 0 / 0
plperlu снять процесс
    #38583843
Dstbl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
perlfunc и perlipc
Интервал целочисленный, поэтому 0.001 не сработало.
...
Рейтинг: 0 / 0
plperlu снять процесс
    #38583882
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dstbl,
снкс, уже почитал
забавная шняжка, одна на всех
т.е. если самому рулить, без дураков, то через что-то типа
Код: php
1.
use threads;
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
plperlu снять процесс
    #39119681
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DstblЕсли http опрашивается через LWP, то там есть настройка таймаута.
В общем случае, можно так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
do language plperlu $PERL$
####### заводим будильник
local $SIG{ALRM} = sub { die "alarm\n" };
alarm 10; # в секундах
####### длительная обработка
use LWP::UserAgent;
warn LWP::UserAgent->new->get('http://127.0.0.1:3000/slowpoke')->content;
####### отрубаем будильник
alarm 0;
$PERL$;



оказалось, что это вредный совет.

надо аккуратно возвращать родной обработчик постгресу по выходу, как тут :

http://search.cpan.org/~timb/DBI/DBI.pm
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
use POSIX qw(:signal_h);

   my $mask = POSIX::SigSet->new( SIGALRM ); # signals to mask in the handler
   my $action = POSIX::SigAction->new(
       sub { die "connect timeout\n" },        # the handler code ref
       $mask,
       # not using (perl 5.8.2 and later) 'safe' switch or sa_flags
   );
   my $oldaction = POSIX::SigAction->new();
   sigaction( SIGALRM, $action, $oldaction );
   my $dbh;
   eval {
      eval {
        alarm(5); # seconds before time out
        $dbh = DBI->connect("dbi:Oracle:$dsn" ... );
      };
      alarm(0); # cancel alarm (if connect worked fast)
      die "$@\n" if $@; # connect died
   };
   sigaction( SIGALRM, $oldaction );  # restore original signal handler
   if ( $@ ) {
     if ($@ eq "connect timeout\n") {...}
     else { # connect died }
   }



иначе приплывает (пусть и редко)
Код: sql
1.
server process (PID) was terminated by signal 14: Alarm clock
...
Рейтинг: 0 / 0
plperlu снять процесс
    #39209139
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

предыдущий рецепт тоже не спасает.
как только перлом подергали SIG | POSIX::SigAction , и в том же процессе (по выходу из перла) дергаем sql к залоченной в другой сессии табличке -- приплываем к
Код: sql
1.
server process (PID) was terminated by signal 14: Alarm clock



якобы питон ведёт себя прилично при возврате после работы с сигналами в sql--контекст.

пичаль.

кашевары е ? как таймаут в перловке без сигналов реализовать ?
[или как кошерно обработчики сигналов возвертать ? чтобы пеже не падал по signal 14: Alarm clock]
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / plperlu снять процесс
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]