Multithreading Perl—在多线程程序中使用LWP
这是我的密码:Multithreading Perl—在多线程程序中使用LWP,multithreading,perl,lwp,Multithreading,Perl,Lwp,这是我的密码: use LWP; use threads; use strict; use warnings; my @thrds; for (1..100) { push @thrds, threads->create( 'doit' ); } for (@thrds) { $_->join(); } sub doit { LWP::UserAgent->new->get("http://dx.doi.org/10.1002/
use LWP;
use threads;
use strict;
use warnings;
my @thrds;
for (1..100)
{
push @thrds, threads->create( 'doit' );
}
for (@thrds)
{
$_->join();
}
sub doit
{
LWP::UserAgent->new->get("http://dx.doi.org/10.1002/aoc.1067");
}
我正在使用Windows7x64和ActivePerl5.20.2x64,我还尝试了StrawberryPerl。
我有很多错误:
线程。。。异常终止:无法在…/URI.pm第81行通过包“URI”找到对象方法“\u URI\u escape”
在(eval 10)第8行,靠近“croak”用法:$io->getlines()”的地方找到了运算符所需的字符串
(你是否需要提前退出?)
如果我加上
sleep 1;
以前
push @thrds, threads->create( 'doit' );
没事的
问题出在哪里?我不知道为什么,但在处理动态加载的模块时似乎存在问题。在创建线程之前显式加载它们可以解决问题。换句话说,添加以下内容:
use Carp qw( );
use URI qw( );
我不知道为什么,但在处理动态加载的模块时似乎存在问题。在创建线程之前显式加载它们可以解决问题。换句话说,添加以下内容:
use Carp qw( );
use URI qw( );
我不知道为什么,但在处理动态加载的模块时似乎存在问题。在创建线程之前显式加载它们可以解决问题。换句话说,添加以下内容:
use Carp qw( );
use URI qw( );
我不知道为什么,但在处理动态加载的模块时似乎存在问题。在创建线程之前显式加载它们可以解决问题。换句话说,添加以下内容:
use Carp qw( );
use URI qw( );
我认为这里的问题是内存占用。毕竟,您正在加载LWP
库,然后克隆您的进程100次
与流行的观点相反,perl中的线程甚至都不是轻量级的。它们不太适合这种使用模式-每个线程都是进程的“完整副本”,这只是。。。这不是一个伟大的计划
我的perl-ActivePerl 5.20.2副本没有出现同样的问题(我不认为——我实际上不想对您列出的网站发送垃圾邮件)
我建议您要么重写线程以使用Thread::Queue
和较低的并行度:
use strict;
use warnings;
use LWP;
use threads;
use Thread::Queue;
my $workers = 10;
my $work_q = Thread::Queue->new();
my $url = "http://localhost:80";
sub worker_thread {
while ( my $url = $work_q->dequeue ) {
LWP::UserAgent->new->get($url);
}
}
threads->create( \&worker_thread ) for 1 .. $workers;
for ( 1 .. 100 ) {
$work_q->enqueue($url);
}
$work_q->end;
foreach my $thread ( threads->list ) {
$thread->join();
}
否则,基于fork的方法也可能更有效:
use strict;
use warnings;
use Parallel::ForkManager;
use LWP;
my $manager = Parallel::ForkManager->new(10);
for ( 1 .. 100 ) {
$manager->start and next;
LWP::UserAgent->new->get("http://localhost:80");
$manager->finish;
}
$manager->wait_all_children;
编辑:
对您的示例进行更多的测试—我确实在运行5.20.2的RHEL上遇到类似的运行时错误
他们有些不同,这确实意味着这里必须有某种比赛条件
这很奇怪,因为线程应该是独立的,而不是
特别是,我的内核因为内存耗尽而被“杀死”,这要归功于几gig的内存占用,这是不使用这种方法的一个很好的理由
我使用RHEL和Perl5.20.2运行代码的测试用例也会引发问题(偶尔)
我得到的是类似类型的错误——偶尔。我看不到明显的思想来源。这可能很简单,因为打开的文件描述符太多或占用的内存太多。这是一个相当沉重的记忆负担 我认为这里的问题是内存占用。毕竟,您正在加载LWP
库,然后克隆您的进程100次
与流行的观点相反,perl中的线程甚至都不是轻量级的。它们不太适合这种使用模式-每个线程都是进程的“完整副本”,这只是。。。这不是一个伟大的计划
我的perl-ActivePerl 5.20.2副本没有出现同样的问题(我不认为——我实际上不想对您列出的网站发送垃圾邮件)
我建议您要么重写线程以使用Thread::Queue
和较低的并行度:
use strict;
use warnings;
use LWP;
use threads;
use Thread::Queue;
my $workers = 10;
my $work_q = Thread::Queue->new();
my $url = "http://localhost:80";
sub worker_thread {
while ( my $url = $work_q->dequeue ) {
LWP::UserAgent->new->get($url);
}
}
threads->create( \&worker_thread ) for 1 .. $workers;
for ( 1 .. 100 ) {
$work_q->enqueue($url);
}
$work_q->end;
foreach my $thread ( threads->list ) {
$thread->join();
}
否则,基于fork的方法也可能更有效:
use strict;
use warnings;
use Parallel::ForkManager;
use LWP;
my $manager = Parallel::ForkManager->new(10);
for ( 1 .. 100 ) {
$manager->start and next;
LWP::UserAgent->new->get("http://localhost:80");
$manager->finish;
}
$manager->wait_all_children;
编辑:
对您的示例进行更多的测试—我确实在运行5.20.2的RHEL上遇到类似的运行时错误
他们有些不同,这确实意味着这里必须有某种比赛条件
这很奇怪,因为线程应该是独立的,而不是
特别是,我的内核因为内存耗尽而被“杀死”,这要归功于几gig的内存占用,这是不使用这种方法的一个很好的理由
我使用RHEL和Perl5.20.2运行代码的测试用例也会引发问题(偶尔)
我得到的是类似类型的错误——偶尔。我看不到明显的思想来源。这可能很简单,因为打开的文件描述符太多或占用的内存太多。这是一个相当沉重的记忆负担 我认为这里的问题是内存占用。毕竟,您正在加载LWP
库,然后克隆您的进程100次
与流行的观点相反,perl中的线程甚至都不是轻量级的。它们不太适合这种使用模式-每个线程都是进程的“完整副本”,这只是。。。这不是一个伟大的计划
我的perl-ActivePerl 5.20.2副本没有出现同样的问题(我不认为——我实际上不想对您列出的网站发送垃圾邮件)
我建议您要么重写线程以使用Thread::Queue
和较低的并行度:
use strict;
use warnings;
use LWP;
use threads;
use Thread::Queue;
my $workers = 10;
my $work_q = Thread::Queue->new();
my $url = "http://localhost:80";
sub worker_thread {
while ( my $url = $work_q->dequeue ) {
LWP::UserAgent->new->get($url);
}
}
threads->create( \&worker_thread ) for 1 .. $workers;
for ( 1 .. 100 ) {
$work_q->enqueue($url);
}
$work_q->end;
foreach my $thread ( threads->list ) {
$thread->join();
}
否则,基于fork的方法也可能更有效:
use strict;
use warnings;
use Parallel::ForkManager;
use LWP;
my $manager = Parallel::ForkManager->new(10);
for ( 1 .. 100 ) {
$manager->start and next;
LWP::UserAgent->new->get("http://localhost:80");
$manager->finish;
}
$manager->wait_all_children;
编辑:
对您的示例进行更多的测试—我确实在运行5.20.2的RHEL上遇到类似的运行时错误
他们有些不同,这确实意味着这里必须有某种比赛条件
这很奇怪,因为线程应该是独立的,而不是
特别是,我的内核因为内存耗尽而被“杀死”,这要归功于几gig的内存占用,这是不使用这种方法的一个很好的理由
我使用RHEL和Perl5.20.2运行代码的测试用例也会引发问题(偶尔)
我得到的是类似类型的错误——偶尔。我看不到明显的思想来源。这可能很简单,因为打开的文件描述符太多或占用的内存太多。这是一个相当沉重的记忆负担 我认为这里的问题是m