【发布时间】:2009-12-03 23:50:31
【问题描述】:
我正在使用以下子例程运行 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();
}
【问题讨论】:
-
我会检查 Digest::MD5。每次我使用它时,我都会将它包装在一个 eval 中。
-
我确实在没有它的情况下测试了脚本,并以相同的速率结束了核心转储。
-
您没有在线程中使用 Thread::Pool 是吗?似乎有一些共识认为该模块可能会导致问题。
-
从一个完整的测试程序中尽可能多地删除,仍然有问题,并展示给我们?
-
除非你展示一个完整的例子,包括你如何使用线程,否则没有人可以帮助你。
标签: perl multithreading thread-safety lwp-useragent