threads::shared我对于成为一个选择的看法是非常错误的。创建线程时,甚至共享数据结构也会被复制。这确实很糟糕,因此我可以总结说 Perl 完全无法进行内存密集型计算。
当进程forks 时,内核会复制整个进程。RAM 中驻留的所有内容都会被复制。没有语言可以解决这个问题。不过,您可以尝试内存映射,或者可以使用线程。
Perl 线程是一种fork模拟,但您可以将变量声明为在线程之间共享:
use threads;
use threads::shared;
my $sharedVariable :shared = 0;
my @worker;
for my $i (1 .. 6) {
push @worker, threads->create(\&worker_sub);
}
$_->join() foreach @worker;
sub worker_sub {
sleep rand 5;
print $sharedVariable, "\n";
}
Run Code Online (Sandbox Code Playgroud)
如果$sharedVariable在一个线程中更新,则更改也会传播到其他线程。如果将 print 语句替换为
print threads->tid, "-->", ++$sharedVariable, "\n";
Run Code Online (Sandbox Code Playgroud)