LWP :: Useragent不是线程安全吗?
-
12-09-2019 - |
题
我正在使用以下子例程运行40或SO线程:
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();
}
解决方案
非线程安全纯perl代码不会引起segfault(实际上,没有纯perl代码应导致segfault)。 perl中的错误会导致segfault。在历史上,Perl中的线程非常有障碍,但是它们的情况要好得多。
您的代码在5.10.1中运行良好,而http :: lite可能不会挠过您遇到的任何perl错误。您可能只需要使用较新版本的Perl即可。越来越接近您获得的redhat,稳定的线程较小。如果要使用线程,请使用最新的perl,可以动手使用。
作为线程的替代方案,您可以使用类似 并行:: forkmanager, LWP ::平行 甚至令人惊奇的 叉子 使用叉模拟线程的模块。
不隶属于 StackOverflow