如何在Perl中创建线程?

时间:2012-09-11 13:33:13

标签: multithreading perl

我有一个简单的Perl脚本,我有一个BIG循环,在其中我调用了或多或少百万次函数my_fun()。我想创建将处理它的线程池 - 同时最多5个线程将​​在循环中调用此方法。

使用最快的库对我来说非常重要 - 看到例子真的很棒。

我的代码如下所示:

for (my $i = 0; $i < 1000000 ; $i++) {
        my_fun();
}

提前谢谢

3 个答案:

答案 0 :(得分:11)

看看Parallel::ForkManager。它使用的是fork,而不是线程,但它应该可以非常简单地完成工作。

示例从文档中取消并略有改动:

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(5); # number of parallel processes

for my $i (0 .. 999999) {
  # Forks and returns the pid for the child:
  my $pid = $pm->start and next;

  #... do some work with $data in the child process ...
  my_fun();

  $pm->finish; # Terminates the child process
}

$pm->wait_all_children;

答案 1 :(得分:3)

我们不能以最快的方式给你,因为这取决于工作,你没有告诉我们工作是什么。

但是您确实询问了线程,因此我将为您提供线程应用程序的基础。这是一个工人模型。它坚固,可维护和可扩展。

use threads;
use Thread::Queue qw( );   # Version 3.01+ required

my $NUM_WORKERS = 5;

sub worker {
   my ($job) = @_;
   ...
}

my $q = Thread::Queue->new();
my @workers;
for (1..$NUM_WORKERS) {
   push @workers, async {
      while (defined(my $job = $q->dequeue())) {
         worker($job);
      }
   };
}

$q->enqueue($_) for @jobs;        # Send work
$q->end();                        # Tell workers they're done.
$_->join() for @workers;          # Wait for the workers to finish.

这是一个基本流程(单向),但通过添加响应队列很容易实现双向。

这使用实际线程,但您可以通过将use threads;切换为use forks;来切换到使用流程。

Parallel::ForkManager也可用于提供工作者模型,但它不断创建新进程而不是重用它们。但这确实可以让它轻松处理儿童死亡。

参考:Thread::Queue(或Thread::Queue::Any

答案 2 :(得分:0)

查看threads文档。