Perl线程模型

时间:2014-02-05 02:40:23

标签: multithreading perl

  • 我有100多个任务要做,我可以循环完成,但这很慢
  • 我想通过线程来做这些工作,比方说,10个线程
  • 作业之间没有依赖关系,每个作业可以独立运行,如果失败则停止
  • 我希望这些线程能够接收我的工作并完成它,总共应该不超过10个线程,否则可能会损害服务器
  • 这些线程一直在完成工作直到完成
  • 超时时停止线程中的作业

我在互联网上搜索有关此内容的信息,Threads::PoolThreads::Queue ... 但我无法确定哪一个更适合我的情况。有人能给我一些建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用Thread :: Queue和线程。

IPC(线程之间的通信)在进程之间更容易理解。

To fork or not to fork?

use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue

# Worker thread
my @thrs = threads->create(sub {
                            while (my $item = $q->dequeue()) {
                                # Do work on $item
                            }
                         })->detach() for 1..10;#for 10 threads
my $dbh = ...
while (1){
  #get items from db
  my @items = get_items_from_db($dbh);
  # Send work to the thread
  $q->enqueue(@items);
  print "Pending items: "$q->pending()."\n";
  sleep 15;#check DB in every 15 secs
}

答案 1 :(得分:0)

我永远不会使用perl线程。原因是它们在概念上不是线程:您必须指定线程之间共享的数据。每个线程都运行一个perl解释器。这就是他们被称为解释线程或ithreads的原因。不用说,这会消耗很多内存,而不是并行运行。 fork()共享内存直到fork point。因此,如果它们是独立的任务,请始终使用fork。它也是Unix最常用的做事方式。