我有一个脚本,我在一个大型数组中加载一次超过300万个值。
我可以通过“for”轻松浏览列表,它运行良好,干净。但是为了加快我的脚本,我想知道是否可以自动将主数组拆分为X个其他数组并在for循环中运行每个数组(可能每个都在一个单独的线程中)。
我希望这些数组具有灵活性,所以我可以选择让我们说4并将它分成4个阵列。
答案 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
}