gpt4 book ai didi

multithreading - 在 Perl 中,如何使用多个线程来处理大型数组的一部分?

转载 作者:行者123 更新时间:2023-12-04 06:42:40 42 4
gpt4 key购买 nike

我需要有关 Perl 多线程的帮助。

基本逻辑是发起20个线程。我有一个数组 @dataarray,我想将 20 个数据 block 传递给每个线程。比如说,@dataarray 中有 200 行数据,所以前 10 行将发送到线程 1,接下来的 10 行应该发送到线程 2,这样它们就不会覆盖彼此的数据,最终处理后线程应将返回结果更新为 @outputarray,位于与源 @datarray 相同的索引位置。

例如:来自 @dataarray 的第 19 行(索引位置 18)被发送到线程 2,因此在处理它之后,线程 2 应该更新 $outputarray[18] = $processed_string.

只需要弄清楚如何将数组的位置发送到特定线程。

#!/usr/bin/perl

use strict;
use threads;
my $num_of_threads = 20;
my @threads = initThreads();
my @dataarray;

foreach(@threads)
{
$_ = threads->create(\&doOperation);
}

foreach(@threads)
{
$_->join();
}

sub initThreads
{
my @initThreads;
for(my $i = 1;$i<=$num_of_threads;$i++)
{
push(@initThreads,$i);
}
return @initThreads;
}

sub doOperation
{
# Get the thread id. Allows each thread to be identified.
my $id = threads->tid();
# Process something--- on array chunk
print "Thread $id done!\n";
# Exit the thread
threads->exit();
}

最佳答案

我不认为我之前所说的必须使用 threads::shared是正确的。我不得不去检查文档,但我不确定。当涉及到 Perl 的线程时,我永远不确定。

更新: 果然,我的不完整理解又暴露了。至少,您需要 threads::shared 才能将每个线程中的结果放入 @output

#!/usr/bin/env perl

use strict; use warnings;
use threads;
use threads::shared;

use List::Util qw( sum );
use YAML;

use constant NUM_THREADS => 20;

my @output :shared;
my @data = ( ([1 .. 10]) x 200);

# note that you'll need different logic to handle left over
# chunks if @data is not evenly divisible by NUM_THREADS
my $chunk_size = @data / NUM_THREADS;

my @threads;

for my $chunk ( 1 .. NUM_THREADS ) {
my $start = ($chunk - 1) * $chunk_size;
push @threads, threads->create(
\&doOperation,
\@data,
$start,
($start + $chunk_size - 1),
\@output,
);
}

$_->join for @threads;

print Dump \@output;

sub doOperation{
my ($data, $start, $end, $output) = @_;

my $id = threads->tid;

print "Thread [$id] starting\n";

for my $i ($start .. $end) {
print "Thread [$id] processing row $i\n";
$output->[$i] = sum @{ $data->[$i] };
sleep 1 if 0.2 > rand;
}

print "Thread $id done!\n";

return;
}

输出:

- 55- 55- 55…- 55- 55- 55- 55

关于multithreading - 在 Perl 中,如何使用多个线程来处理大型数组的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438896/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com