首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LWP::UserAgent不线程安全吗?

LWP::UserAgent不线程安全吗?
EN

Stack Overflow用户
提问于 2009-12-03 23:50:31
回答 1查看 3.1K关注 0票数 2

我使用以下子程序运行大约40个线程:

代码语言:javascript
运行
复制
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不线程安全吗?

更新:

下面是一个最简单的版本来重现这个问题:

代码语言:javascript
运行
复制
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();
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-12-05 09:16:15

非线程安全的纯Perl代码不会导致分段错误(实际上,没有任何纯Perl代码会导致分段错误)。Perl中的一个bug会导致分段错误。Perl中的线程在历史上是非常错误的,但是它们已经变得更好了。

您的代码在5.10.1中运行良好,HTTP::Lite可能只是不挠您遇到的perl bug。很可能您只需要使用一个较新版本的Perl。越老越接近Redhat,线程就越不稳定。如果要使用线程,可以使用最新的Perl。

作为线程的替代,您可以使用类似并行::ForkManagerLWP::并行或甚至惊人的叉子模块来模拟使用叉的线程。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1843932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档