[Moscow.pm] AnyEven::HTTP перед и после fork с сокетами между процессами
Mons Anderson
mons на cpan.org
Ср Окт 16 07:17:07 PDT 2013
Подтверждаю, проблема с форками в AnyEvent::DNS.
Сокет там UDP'шный.
у нас решается так:
use AnyEvent::DNS ();
BEGIN {
no warnings 'redefine';
my $RESOLVER;
my $FORPID = 0;
my $res = \&AnyEvent::DNS::resolver;
*AnyEvent::DNS::resolver = sub () {
undef $RESOLVER if $FORPID != $$;
$RESOLVER || do {
#warn "Create overriden resolver for $$. previous was for $FORPID";
undef $AnyEvent::DNS::RESOLVER;
local $AnyEvent::DNS::RESOLVER;
$FORPID = $$;
$RESOLVER = AnyEvent::DNS->$res();
};
};
# для дебага:
my $new = \&AnyEvent::DNS::new;
*AnyEvent::DNS::new = sub {
Carp::cluck( "$$: Creating DNS resolver" );
goto &$new;
};
}
On 16.10.2013, at 17:41, Гришаев Анатолий <0body0 на rambler.ru> wrote:
>
> Я в AnyEvent::DNS глубоко не влазил, а твой случай у меня не подтверждается.
> Может только PERL_ANYEVENT_MODEL=EV чуть медленнее отрабатывает чем PERL_ANYEVENT_MODEL=Perl, да и то в пределах полсекунды.
> А на всякий случай высылаю версии модулей с которыми у меня работает, может поможет :)
>
>
> Самое близкая к тебе конфигурация, которая работает у меня вот
> FreeBSD 7.2-RELEASE-p4
> Perl v5.10.1
> EV 4.11
> AnyEvent 7.04
> AnyEvent::HTTP 2.15
>
> А вот линукс
> Linux 3.2.0-45-generic #70-Ubuntu SMP Wed May 29 20:11:31 UTC 2013 i686 i686 i386 GNU/Linux
> Perl v5.14.2
> EV 4.03
> AnyEvent 6.12
> AnyEvent::HTTP 2.13
>
> Есть еще FreeBSD 8, но там
> EV 4.15
> AnyEvent 6.12
> AnyEvent::HTTP 2.13
> Perl v5.16.3
>
>
> 16.10.2013 16:12, ksvs пишет:
>>
>> FreeBSD 9.2-RELEASE
>> Perl v5.14.4
>> EV 4.15
>> AnyEvent 7.04
>> AnyEvent::HTTP 2.15
>>
>>
>> Мое одно письмо на модерацию попало.
>> Вот оно.
>>
>> Да, работает (если исключить RESOLVER).
>> А ведь была сначала мысль, что с dns у него проблема, но поститал, что раз
>> сказал persistent => 0, то AnyEvent::HTTP должен дальше и сказать тоже не
>> сохранять открытые сокеты. :-)
>>
>> А почему в netstat не видно открытого сокета?
>>
>> Но как поремонтироваь это - не знаю.
>> Перед fork делаю
>>
>>
>> {
>> ...
>>
>> my $rs = $AnyEvent::DNS::RESOLVER;
>> $$rs{rw4} = $$rs{rw6} = undef;
>> undef $AnyEvent::DNS::RESOLVER;
>>
>> }
>>
>> Отрегистрируем обработчики и уничтожаем resolver: сокеты закроются, так как my на них.
>> Не помогает.
>>
>>
>> On Wednesday, 16 October 2013, 14:47, Гришаев Анатолий <0body0 на rambler.ru> wrote:
>>
>> Либо тебе не повезло,
>> либо у тебя забавные библиотеки:
>>
>> Проверил на FreeBSD + Linux
>> с perl 5.10, 5.14, 5.16
>> с EV и без него.
>>
>> Со строчкой работает,
>> без строчки нет.
>>
>
>
> --
> С уважением Анатолий.
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
Подробная информация о списке рассылки Moscow-pm