gpt4 book ai didi

multithreading - Perl 线程共享数据

转载 作者:行者123 更新时间:2023-12-03 12:56:08 27 4
gpt4 key购买 nike

在我的脚本中,有 n 个工作线程 (0,1..n-1),每个线程都处理以下数组的第 N 个项目。输入数组用于为线程提供输入,输出数组接受线程的输出。线程不会访问数组的其他项。在这种情况下,我应该将数组声明为 shared 吗?

my @ThreadInput   :shared=();
my @ThreadOutput :shared=();

最佳答案

(我将填充 @ThreadInput 并消耗 @ThreadOutput 的线程命名为“调用者”。)

Perl 变量不会在线程之间共享,除非标记为 :shared .每个线程都会获得一份未标记为 :shared 的变量的副本。 .

所以,

如果调用者填充 @ThreadInput在 worker 开始之前,@ThreadInput不需要共享,但如果是,它将避免为每个工作人员创建数组的副本。

如果调用者填充 @ThreadInput worker 开始后,@ThreadInput必须共享。如果不是,调用者的 @ThreadInput 中的更改不会影响 worker 的副本。
@ThreadOutput必须共享。如果不是,则 worker 的 @ThreadOutput 发生变化不会影响调用者的副本。

使用该模型重用 worker 将非常困难。您可能应该使用更类似于以下内容的内容:

use threads;
use Thread::Queue 1.03; # or Thread::Queue::Any

use constant NUM_WORKERS => ...;

sub handle_request {
my ($request) = @_;
return ...response...;
}


{
my $request_q = Thread::Queue->new();
my $response_q = Thread::Queue->new();

my @threads;
my $threads;
for (1..NUM_WORKERS) {
++$threads;
push @threads, async {
while (my $request = $request_q->dequeue()) {
$response_q->enqueue([ $request => handle_request($request) ]);
}

$response_q->enqueue(undef);
};
}

... Add stuff to queue $request_q->enqueue(...) ...

$request_q->end(); # Can be done later if you want to add more items later.

while ($threads && my $job = $response_q->dequeue()) {
if (!defined($job)) {
--$threads;
next;
}

my ($request, $response) = @$job;
... handle response ...
}

$_->join for @threads;
}

关于multithreading - Perl 线程共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16906488/

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