perl,同时启动更多进程

时间:2013-05-19 17:31:49

标签: multithreading perl fork

我在Windows XP上使用Strawberry Perl下载多个html页面,我希望每个页面都有一个变量。

现在我正在这样做,但正如我所看到的,它一次只能获得一页:

my $page = `curl -s http://mysite.com/page -m 2`;
my $page2 = `curl -s http://myothersite.com/page -m 2`;

我查看了Parallel :: ForkManager,但无法使其工作。 还尝试在start之前使用windows命令curl但是没有获取页面。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:3)

Parallel::ForkManager模块应该适合您,但因为它使用fork而不是线程,所以父进程和每个子进程中的变量是分开的,它们必须以不同的方式进行通信。 / p>

此程序使用-o的{​​{1}}选项将页面保存在文件中。例如,curl的文件保存在文件http://mysite.com/page中,并可由父进程从那里检索。

http\mysite.com\page

<强>更新

这是一个使用threadsthreads::shared将每个页面返回到所有线程之间共享的哈希的版本。散列必须标记为共享,并在修改之前锁定,以防止并发访问。

use strict;
use warnings;

use Parallel::ForkManager;
use URI;
use File::Spec;
use File::Path 'make_path';

my $pm = Parallel::ForkManager->new(10);

foreach my $site (qw( http://mysite.com/page http://myothersite.com/page )) {
  my $pid = $pm->start;
  next if $pid;
  fetch($site);
  $pm->finish;
}

$pm->wait_all_children;

sub fetch {
  my ($url) = @_;

  my $uri = URI->new($url);
  my $filename = File::Spec->catfile($uri->scheme, $uri->host, $uri->path);
  my ($vol, $dir, $file) = File::Spec->splitpath($filename);

  make_path $dir;
  print `curl http://mysite.com/page -m 2 -o $filename`;
}