LWP :: UserAgent не безопасен для потока?
-
12-09-2019 - |
Вопрос
Я запускаю 40-или---то потоки со следующей подпрограммой:
my $app = shift;
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
my $response = $ua->get($$app{'watch_url'});
my $new_md5;
if ($response->is_success()) {
$new_md5 = md5_hex($response->content());
}
return ($$app{'short_name'}, $$app{'watch_md5'}, $new_md5);
Основные дампы заступают примерно в 3/4 времени. LWP и LWP :: UserAgent-это чистый Perl, поэтому меня застигнут за пределами защиты от этого. LWP :: UserAgent не безопасен для потока?
Обновлять:
Вот минимальная версия, чтобы воспроизвести проблему:
use strict;
use warnings;
use threads;
use LWP::UserAgent;
sub check_app {
my $ua = LWP::UserAgent->new();
$ua->timeout(5);
$ua->get('http://www.flatdoc.com/?' . rand(10));
}
my @threads;
for (my $i = 0; $i < 40; $i++) {
my $thread = threads->create(\&check_app);
push(@threads, $thread);
}
foreach (@threads) {
$_->join();
}
Решение
Безопасный код без тряпки не вызывает SEGFAULT (на самом деле, ни один чистый код PERL не должен вызывать SEGFAULT). Ошибка в Perl вызывает сегфо. И темы в Perl исторически очень глюки, но они стали намного лучше.
Ваш код работает нормально в 5.10.1, а http :: lite, вероятно, просто не щекотает любую ошибку Perl, с которой вы столкнулись. Скорее всего, вам просто нужно использовать более новую версию Perl. Чем старше и ближе к Redhat вы получаете, тем менее стабильные потоки. Если вы собираетесь использовать потоки, используйте новейший Perl, который вы можете получить.
В качестве альтернативы потокам вы можете использовать что -то вроде Параллель :: forkmanager, LWP :: Параллель или даже удивительный Форк модуль, который эмулирует потоки, используя вилку.