#perl #lwp-useragent
#perl #lwp-useragent
Вопрос:
В скрипте perl я использую LWP ::UserAgent следующим образом:
my $ua = LWP::UserAgent->new( keep_alive => 10 );
После выполнения $ua->get
нескольких тысяч раз для извлечения URL-адресов, скажем, https://example.com , я бы ожидал $ua->conn_cache
, что у меня будет десять открытых соединений. Но, если я использую Data::Dumper и делаю:
print Dumper( $ua->conn_cache );
Я вижу только одно соединение:
$VAR1 = bless( {
'cc_limit_total' => 10,
'cc_conns' => [
[
bless( *Symbol::GEN1, 'LWP::Protocol::https::Socket' ),
'https',
'example.com:443',
1638549871
]
]
}, 'LWP::ConnCache' );
Я делаю что-то не так, или я просто неправильно интерпретирую то, что мне показывает дамп conn_cache? Как бы то ни было, URL-адреса, которые я извлекаю, отличаются только параметрами запроса.
Редактировать: Хорошо, я понимаю (см. Ответ ниже). Спасибо. Вместо этого я рассмотрю такие вещи, как LWP ::Parallel::UserAgent .
Ответ №1:
Самый эффективный способ обработки многих последовательных запросов к одному и тому же хосту — это повторно использовать одно постоянное TCP-соединение с этим хостом — и это именно то, что вы видите. Требуется больше подключений, если запросы к одному и тому же хосту отправляются параллельно, а не последовательно, или если запросы отправляются на несколько хостов.
Чтобы проверить последнее, просто выполните запросы к example.com и example.org — в итоге вы получите две записи в кэше соединений, одну для example.com и один для example.org .
Комментарии:
1. Все запросы, которые я делаю, независимы, и я хотел бы выполнять многие из них параллельно, если это возможно.
2. @BryanWright: «Я хотел бы сделать многие из них параллельно, если это возможно» — это другой вопрос, на текущий дан ответ. LWP ::UserAgent сам по себе не поддерживает параллельные запросы, вам нужно либо использовать для этого потоки, либо даже основанное программирование, как это возможно с Mojo ::UserAgent.
3. Или Coro «threads» LWP::UserAgent с помощью LWP ::Protocol::AnyEvent::http