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

标签 perl multithreading thread-safety lwp-useragent

我正在使用以下子例程运行 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 中的线程历来都是有很多 bug 的,但现在已经好多了。

您的代码在 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/

相关文章:

regex - 以星号*开头的Perl标识符代表什么?

c++ - 从 dll 导入的类的线程安全

c# - 正则表达式提取括号之间还包含其他括号的字符串

perl - 在文本小部件中打印行号

python - 如何同步python列表?

除非最后一条语句很慢,否则python函数无法返回

c# - 在 C# 中使一个函数或一组语句线程安全的最佳方法是什么?

java - 从 java 中的 ScheduledThreadPoolExecutor --> ExecutorService 滴下中断(kill -15 或 9)信号(Ctrl + C)

string - Perl:从文件读取后如何检查数组列中单词的最大宽度?

python - 确定线程是否完成的非阻塞方式?