gpt4 book ai didi

perl - LWP::UserAgent 不是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-03 12:53:24 30 4
gpt4 key购买 nike

我正在使用以下子例程运行 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();
}

最佳答案

非线程安全的纯 Perl 代码不会导致段错误(事实上,没有纯 Perl 代码会导致段错误)。 Perl 中的错误会导致段错误。 Perl 中的线程在历史上非常有缺陷,但它们已经变得更好了。

您的代码在 5.10.1 中运行良好,并且 HTTP::Lite 可能只是无法解决您遇到的任何 perl 错误。您可能只需要使用更新版本的 Perl。您获得的越老和越接近 Redhat,线程就越不稳定。如果您打算使用线程,请使用最新的 Perl。

作为线程的替代方案,您可以使用 Parallel::ForkManager 之类的东西, LWP::Parallel甚至是惊人的forks使用 fork 模拟线程的模块。

关于perl - LWP::UserAgent 不是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1843932/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com