[Moscow.pm] AnyEven::HTTP перед и после fork с сокетами между процессами
Гришаев Анатолий
0body0 на rambler.ru
Ср Окт 16 03:02:32 PDT 2013
Перед форком или сразу после нужно очистить кэш DNS:
$AnyEvent::DNS::RESOLVER = undef;
Вот уже работающий пример:
==============================
$| = 1;
use strict;
use warnings;
use AnyEvent::DNS ();
use EV;
$EV::FLAG_FORKCHECK = 1;
use AnyEvent;
use AnyEvent::HTTP;
my $URL = "http://www.bing.com";
if ($ARGV[0]) {
my $w = AnyEvent->condvar;
http_get $URL, persistent => 0, keepalive => 0, sub {
print ". $_[1]{Status} $_[1]{Reason} $_[1]{URL}; $$\n";
$w->send;
};
$w->recv;
print "...\n";
}
use IO::Socket;
socketpair(my $child, my $parent, AF_UNIX, SOCK_STREAM, PF_UNSPEC) or
die "socketpair: $!";
$AnyEvent::DNS::RESOLVER = undef;
my $kid_pid = fork;
defined $kid_pid or die "Can't fork: $!";
unless ($kid_pid) {
close $child;
my $w = AnyEvent->condvar;
my $wr = AnyEvent->io(fh => $parent, poll => "r", cb => sub {
my $len = sysread $parent, my $buf, 1024;
unless ($len) {
# print"child EXIT\n";
exit;
};
print $buf;
http_get $URL, persistent => 0, sub {
print "+ $_[1]{Status} $_[1]{Reason} $_[1]{URL}; $$\n";
syswrite $parent, "pong\n";
};
});
$w->recv;
exit;
} else {
close $parent;
my $i = 0;
my $w = AnyEvent->condvar;
my $wr = AnyEvent->io(fh => $child, poll => "r", cb => sub {
sysread $child, my $buf, 1024;
# print $buf;
if (++$i > 3) {
# print "parent EXIT\n";
exit;
} else {
syswrite $child, "ping $i\n";
}
});
syswrite $child, "ping $i\n";
$w->recv;
}
==============================
--
С уважением Анатолий.
Подробная информация о списке рассылки Moscow-pm