про alarm знаю, но хочу без него. все равно ведь придется враппер делать вокруг, чтоб все удобно и красиво.
2012/10/2 Konstantin S. Uvarin <[email protected]> > Приветствую! > > > Всем привет. Я так давно работаю исключительно с AE, что совсем выпал из > > темы синхронных библиотек ) > > Есть простейшая задача: tcp connect / host resolution / socket rw. > > Но! С жестко заданным таймаутом. > > > > Всяческие IO::Socket* могут легко заблокироваться на неограниченное > время, > > например на ресолве. > > > > Есть мысль написать что-то синхронное, аналогичное AnyEvent::Socket и > > AnyEvent::DNS, но с жестким контролем таймаутов. > > А разве в AnyEvent не будет "жесткий контроль таймаутов", если написать:? > > my $cv = AnyEvent->condvar; > my $timer = AnyEvent->timer( > after => $timeout, > cb => sub { $cv->croak("Timeout after $timeout seconds"); } > ); > # DWIM > $cv->recv; > undef $timer; > > Т.е., как я понимаю, он уйдет в select, НО с таким таймаутом, чтобы успеть > к > ближайшему timer-у. Во всяком случае, так показывает strace. > > Конечно-же я знаю такой способ. только с записью красивее ) my $cv = AE::cv; my $t = ae::timer $timeout,0,sub { $cv->croak("Timeout"); } tcp_connect ..., sub { $cv->send(@_) }; my $fh = $cv->recv; Но написал-ведь: без AE. Предполагается потенциальное использование в любом окружении, в т.ч. и там, где может выполняться уже другой Event Loop, в том числе и AnyEvent. (А для него, если вы не в курсе, $cv->recv inside $another_cv->recv запрещен) > Ещё вариант - IO::Select - там есть параметр timeout, который гарантирует, > что > блокировка будет ограничена по времени. > > IO::Select просто упрощенный враппер над select. Ладно, я так понял, что ничего адекватного существующего нет. Ок, ждите либу... -- Best wishes, Vladimir V. Perepelitsa aka Mons Anderson <[email protected]>, <[email protected]> http://github.com/Mons
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
