拆分多个线程的数组

时间:2014-05-28 01:08:28

标签: arrays perl for-loop

我有一个脚本,我在一个大型数组中加载一次超过300万个值。

我可以通过“for”轻松浏览列表,它运行良好,干净。但是为了加快我的脚本,我想知道是否可以自动将主数组拆分为X个其他数组并在for循环中运行每个数组(可能每个都在一个单独的线程中)。

我希望这些数组具有灵活性,所以我可以选择让我们说4并将它分成4个阵列。

1 个答案:

答案 0 :(得分:0)

我会使用Paralel :: Queue和线程。你也可以使用另一个mmodules或fork,但是在线程中共享数据要比在进程之间共享数据容易得多。

我认为您的问题在于您的线程代码已经创建了数组然后创建了线程。这样每个线程都复制了你的数组。使用队列将数据发送到线程会更有效。

有关其他方法,请参阅此处的一些示例:To fork or not to fork?

use strict;
use warnings;

use threads;
use Thread::Queue;

my $q = Thread::Queue->new();    # A new empty queue
my $num_of_threads=4;
# Worker thread creation
my @thrs = threads->create(sub {
                            while (my $item = $q->dequeue()) {
                                return 1 if $item eq 'STOP_TH';
                                process_item($item);
                            }
                         }) for 1..$num_of_threads;

### you are reading your data in loop
while (..){
  ### put data into threads queue
  $q->enqueue(@items);
}
### signal the threads that you have no more data
$q->enqueue('STOP_TH') for 1..$num_of_threads;
### wait until all threads finish
$_->join() for @thrs;

sub process_item {
  my $item = shift;
  ### do whatever you like with item

}