在脚本中,我使用线程和Thread :: Queue,并使用版本perl 5.18.2。当我运行我的脚本时,它会给出错误:此Perl不是为支持线程而构建的 在文档中,我读到,这是一个错误。 解决此问题的可能解决方案是什么?
答案 0 :(得分:5)
forks
module是threads
的替代品。它支持相同的API,因此唯一需要的更改是替换
use threads;
use threads::shared;
通过
use forks;
use forks::shared;
然后使用相同的线程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;
}
}
示例输出:
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
答案 1 :(得分:4)
构建Perl时,需要使用-Dusethreads
构建支持线程的Perl。
sh ./Configure -Dusethreads
make test
make install
我个人使用perlbrew
安装Perl。
perlbrew install 5.18.2 --as=5.18.2t -Dusethreads
答案 2 :(得分:1)
在不更改源代码的情况下,您可以先加载 forks 模块,这将允许程序使用 threads API。
perl -Mforks -e 'use threads'
或
perl -Mforks myscript.pl
答案 3 :(得分:0)
如果您当前的版本未通过内置线程启用,则似乎会发生此错误。
我正在使用 pleenv 安装 perl,并使用 carton 作为包管理器,我尝试运行 plenv install [perl-version] -Dusethreads --as [perl-version]-threads
来启用,但失败了。
因此,我不得不使用 fork 而不是使用线程。
use forks;
use strict;
use warnings;
use feature 'say';
my $total_thread_number = 10;
my @workers;
my @final_responses;
my @workers = map {
threads->create(\&send_transaction)
} 1..$total_thread_number;
foreach my $worker (@workers) {
my $response = $worker->join;
push @final_responses, $response;
}
sub send_transaction {
my ($transaction) = shift;
# do your things
}
# read final responses
foreach my $response (@final_responses){
say ( dumper($response));
}
而不是使用
use threads; # this seems to work with perl enabled with in-built thread
for ((1 .. $total_thread_number)) {
push @workers, async {
send_transaction($transaction);
};
}
使用示例代码创建一个工作 git 项目。 https://github.com/Aibier/loadtesting