Multithreading 如何在请求Perl时使用线程

Multithreading 如何在请求Perl时使用线程,multithreading,perl,request,Multithreading,Perl,Request,我将发布以下简单脚本: 1为一个站点打开包含多个URL的文本文件。 2第一行获取站点的地址并发出请求。 3.根据条件验证内容。 线程希望添加此脚本以加快速度,但不知道如何做。有人能帮我吗 #!/usr/bin/perl use LWP::UserAgent; use HTTP::Request; use LWP::Simple; $sis="$^O";if ($sis eq linux){ $cmd="clear";} else { $cmd="cls"; } system("$cmd

我将发布以下简单脚本: 1为一个站点打开包含多个URL的文本文件。 2第一行获取站点的地址并发出请求。 3.根据条件验证内容。 线程希望添加此脚本以加快速度,但不知道如何做。有人能帮我吗

    #!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Request;
use LWP::Simple;

$sis="$^O";if ($sis eq linux){ $cmd="clear";} else { $cmd="cls"; }
system("$cmd");

if (!$ARGV[0]) {

$sis="$^O";if ($sis eq linux){ $cmd="clear";} else { $cmd="cls"; }
system("$cmd");

print q {
[+] Request.....

};

open( SITE, "< $ARGV[0]" ) or die( "No open: $!" );

our @array = <LINES>;

$numbers = $#array;

for ($i = 0; $i <= $numebers; $i++) {

$url = "$array[$i]";

my $req=HTTP::Request->new(GET=>$url);
my $ua=LWP::UserAgent->new();
$ua->timeout(15);
my $resposta=$ua->request($req);

if($resposta->content =~ /Exist/) {

print "n t $url n";

open (NOTEPAD, ">> texto.txt");
print NOTEPAD "$url";
close(NOTEPAD);

}
}

print q {

[+] FIM !
};
#/usr/bin/perl
使用LWP::UserAgent;
使用HTTP::请求;
使用LWP::Simple;
$sis=“$^O”;如果($sis eq linux){$cmd=“clear”}否则{$cmd=“cls”}
系统(“$cmd”);
如果(!$ARGV[0]){
$sis=“$^O”if($sis eq linux){$cmd=“clear”}else{$cmd=“cls”}
系统(“$cmd”);
打印q{
[+]请求。。。。。
};
打开(站点“<$ARGV[0]”)或死亡(“无打开:$!”);
我们的@array=;
$numbers=$#数组;
对于($i=0;$i new(GET=>$url);
my$ua=LWP::UserAgent->new();
$ua->超时(15);
我的$resposta=$ua->request($req);
如果($resposta->content=~/Exist/){
打印“n t$url n”;
打开(记事本“>>texto.txt”);
打印记事本“$url”;
关闭(记事本);
}
}
打印q{
[+]FIM!
};
#!/usr/bin/perl
严格使用;
使用警告;
使用线程;
使用线程::共享;
使用Fcntl qw(锁紧装置);
使用IO::handleqw();
使用LWP::UserAgent qw();
使用Thread::Queue 3.01 qw();
使用常量NUM_WORKERS=>20;
我的$output\u锁:共享;
我的$output\u fh;
子写入到输出文件{
锁($output\u lock);
打印(输出);
$output_fh->flush();
}
下属{
我的($ua,$url)=@;
my$response=$ua->get($url);
写入输出文件($url\n)
如果$response->success
&&$response->content=~/Exist/;
}
{
$output\u fh=\*STDOUT;\或打开一个文件。
my$q=线程::队列->新建();
适用于(1..NUM_工人){
异步的{
my$ua=LWP::UserAgent->new(超时=>15);
而(我的$job=$q->dequeue()){
工人($ua,$job);
}
};
}
而(){
咀嚼;
$q->enqueue($\uq);
}
$q->end();
$\->join()用于线程->列表();
}

可能会尝试将输出子线程也放入一个线程,并使用队列为其提供数据。我有错误:全局符号“$fh”在script.pl第18行需要显式的包名。全局符号“$fh”在script.pl第19行需要显式的包名。由于编译错误,script.pl的执行被中止。为什么会出现此错误?
#!/usr/bin/perl
use strict;
use warnings;
use threads;
use threads::shared;

use Fcntl              qw( LOCK_EX );
use IO::Handle         qw( );
use LWP::UserAgent     qw( );
use Thread::Queue 3.01 qw( );

use constant NUM_WORKERS => 20;

my $output_lock :shared;
my $output_fh;
sub write_to_output_file {
   lock($output_lock);
   print($output_fh @_);
   $output_fh->flush();
}

sub worker {
   my ($ua, $url) = @_;
   my $response = $ua->get($url);
   write_to_output_file("$url\n")
      if $response->success
      && $response->content =~ /Exist/;       
}

{
   $output_fh = \*STDOUT;  # Or open a file.

   my $q = Thread::Queue->new();
   for (1..NUM_WORKERS) {
      async {
         my $ua = LWP::UserAgent->new( timeout => 15 );
         while (my $job = $q->dequeue()) {
            worker($ua, $job);
         }
      };
   }

   while (<>) {
      chomp;
      $q->enqueue($_);
   }

   $q->end();
   $_->join() for threads->list();
}