Как я могу заставить LWP ::UserAgent кэшировать соединения?

#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