在脚本中,我使用线程和Thread :: Queue,并使用版本perl 5.18.2.当我运行我的脚本时,它给出了错误:这个Perl不是为支持线程而构建的. 在文档中,我读到,这是一个错误.解决此问题的可能解决方案是什么?
该forks模块是替代品threads.它支持相同的API,因此唯一需要的更改是替换
use threads;
use threads::shared;
Run Code Online (Sandbox Code Playgroud)
通过
use forks;
use forks::shared;
Run Code Online (Sandbox Code Playgroud)
然后,您使用相同的线程API,即threads->create(\&worker)类似的东西.这些模块forks和forks::shared应加载第一个模块.请注意,它forks具有不同的性能特征threads:分离新进程比启动线程(使用threads模块)便宜,但进程之间的通信比线程之间的通信更昂贵.
由于forks是直接替代的threads,它的工作原理就好了Thread::Queue:
use forks;
use strict;
use warnings;
use feature 'say';
use Thread::Queue;
my $q = Thread::Queue->new;
my @workers = map { threads->create(\&worker, $q) } 1..3;
$q->enqueue(1..9);
$q->end;
$_->join for @workers;
sub worker {
my $q = shift;
my $tid = threads->tid;
while(defined(my $item = $q->dequeue)) {
say "$tid got $item";
sleep 1;
}
}
Run Code Online (Sandbox Code Playgroud)
示例输出:
1 got 1
2 got 2
3 got 3
1 got 4
2 got 5
3 got 6
1 got 7
2 got 8
3 got 9
Run Code Online (Sandbox Code Playgroud)