【问题标题】:How to create threads in Perl?如何在 Perl 中创建线程?
【发布时间】:2017-06-16 00:44:20
【问题描述】:

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

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

我的代码如下所示:

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

提前谢谢你

【问题讨论】:

  • 您真的需要线程(如共享内存、并发控制)还是仅仅需要独立的并行执行?如果是后者,请考虑 Parallel::ForkManager - POD 提供了如何轻松一次执行 5 个分叉的示例。
  • @DVK 我没有看到你的评论。不想窃取你的想法,抱歉。
  • @simbabque - 没问题。 (1) 反正我懒得去查资料发帖了; (2) SO 上的内容是抄送,我不拥有它:) ; (3)不像我从来没有借用评论的想法来回答,尽管像你一样,我总是明确地告诉评论者。无论如何,为一个很好的示例代码 +1
  • 如果你想要最快的方式来做你的事情,你为什么要限制可以使用的方式(说它必须使用一个线程池),你为什么不告诉我们什么那是什么?

标签: multithreading perl


【解决方案1】:

看看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;

【讨论】:

  • 这样的 Windows 解决方案?
  • @javaGirl 它应该可以在 Windows 上运行。我刚刚在 Windows 上对其进行了测试,它适用于我。
【解决方案2】:

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

但是您确实询问了线程,所以我将为您介绍线程应用程序的基础。这是一个工人模型。它是健壮的、可维护的和可扩展的。

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

【讨论】:

    【解决方案3】:

    查看threads 文档。

    【讨论】:

    • 是的,我当然已经读过了,但我需要最快的方法,所以我问了
    猜你喜欢
    • 2014-05-27
    • 2010-10-05
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多