Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Perl—在多线程程序中使用LWP_Multithreading_Perl_Lwp - Fatal编程技术网

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