Multithreading 如何在Perl中创建线程?

Multithreading 如何在Perl中创建线程?,multithreading,perl,Multithreading,Perl,我有一个简单的Perl脚本,其中有一个大循环,在这个脚本中,我调用了大约一百万次函数my_fun()。我想创建一个线程池来处理这个问题——在同一时间内最多有5个线程在循环中调用这个方法 对我来说,使用最快的库是非常重要的——看到示例会非常好 我的代码如下所示: for (my $i = 0; $i < 1000000 ; $i++) { my_fun(); } for(我的$i=0;$i

我有一个简单的Perl脚本,其中有一个大循环,在这个脚本中,我调用了大约一百万次函数
my_fun()
。我想创建一个线程池来处理这个问题——在同一时间内最多有5个线程在循环中调用这个方法

对我来说,使用最快的库是非常重要的——看到示例会非常好

我的代码如下所示:

for (my $i = 0; $i < 1000000 ; $i++) {
        my_fun();
}
for(我的$i=0;$i<1000000;$i++){
我的乐趣;
}
提前感谢您

请查看文档。

请查看。它使用的是
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;

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

<>但是你确实问过线程,所以我会给你一个线程应用程序的基础。这是一个工人模型。它是健壮的、可维护的和可扩展的

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切换到使用进程
使用叉子

也可用于提供工作者模型,但它不断地创建新流程,而不是重用它们。不过,这确实让它能够轻松处理儿童死亡问题


Ref:(或)

是的,当然我已经读过了,但我需要最快的方法,所以为什么我问你真的需要线程(如共享内存、并发控制)或仅仅是独立的并行执行?如果后者,考虑并行::FokMealth-POD有一个例子,说明如何一次做5个叉。@ DVK我没有看到你的评论。我不想偷你的主意,对不起。@simbabque-没问题。(1) 我太懒了,根本不想查看详细信息并发表文章;(2) 内容就是CC,我不拥有它:);(3) 不像我从来没有借用一个评论的想法作为答案,尽管像你一样,我总是明确地告诉评论者。总之,+1是一个很好的示例代码如果你想以最快的方式完成你的工作,为什么你要限制使用哪种方式(说它必须使用线程池),为什么你不告诉我们这是什么东西?有这样的Windows解决方案吗?@javaGirl它应该在Windows上工作。我刚刚在Windows上测试了它,它对我很有效。