다음 코드를 사용하여 자체 작성 모듈에서 스레드로 서브 루틴을 전달하려고합니다.Perl hand 모듈에서 스레드
이것은 처음 사용하는 스레드이므로 익숙하지 않습니다.
홈페이지 스크립트 (shortend)
#!/usr/bin/perl -w
use strict;
use threads;
use lib 'PATH TO LIB';
use goldstandard;
my $delete_raw_files = 0;
my $outfolder = /PATH/;
my %folder = goldstandard -> create_folder($outfolder,$delete_raw_files);
&tagging if $tagging == 1;
sub tagging{
my %hash = goldstandard -> tagging_hash(\%folder);
my @threads;
foreach(keys %hash){
if($_ =~ m/mate/){
my $arguments = "goldstandard -> mate_tagging($hash{$_}{raw},$hash{$_}{temp},$hash{$_}{tagged},$mate_anna,$mate_model)";
push(@threads,$arguments);
}
if($_ =~ m/morpheus/){
my $arguments = "goldstandard -> morpheus_tagging($hash{$_}{source},$hash{$_}{tagged},$morpheus_stemlib,$morpheus_cruncher)";
push(@threads,$arguments)
}
}
foreach(@threads){
my $thread = threads->create($_);
$thread ->join();
}
}
모듈
package goldstandard;
use strict;
use warnings;
sub mate_tagging{
my $Referenz = shift;
my $input = shift;
my $output_temp_dir = shift;
my $output_mate_human = shift;
my $anna = shift;
my $model = shift;
opendir(DIR,"$input");
my @dir = readdir(DIR);
my $anzahl = @dir;
foreach(@dir){
unless($_ =~ m/^\./){
my $name = $_;
my $path = $input . $_;
my $out_temp = $output_temp_dir . $name;
my $out_mate_human_final = $output_mate_human . $name;
qx(java -Xmx10G -classpath $anna is2.tag.Tagger -model $model -test $path -out $out_temp);
open(OUT, "> $out_mate_human_final");
open(TEMP, "< $out_temp");
my $output_text;
while(<TEMP>){
unless($_ =~ m/^\s+$/){
if ($_ =~ m/^\d+\t(.*?)\t_\t_\t_\t(.*?)\t_\t/) {
my $tags = $2;
my $words = $1;
print OUT "$words\t$tags\n";
}
}
}
}
}
}
sub morpheus_tagging{
my $Referenz = shift;
my $input = shift;
my $output = shift;
my $stemlib = shift;
my $cruncher = shift;
opendir(DIR,"$input");
my @dir = readdir(DIR);
foreach(@dir){
unless($_ =~ m/^\./){
my $name = $_;
my $path = $input . $_;
my $out = $output . $name;
qx(env MORPHLIB='$stemlib' '$cruncher' < '$path' > '$out');
}
}
}
1;
이 코드를 실행하는
Thread 1 terminated abnormally: Undefined subroutine &main::goldstandard -> morpheus_tagging(...) called at ... line 43.
은 내가이 자국 또는 방법 I를 호출하고 eather 방법을 생각 나에게 도착 논쟁을 제공하는 것이 잘못되었습니다. 나는 그걸로 나를 도울 수 있기를 바래? 나 또한 안전하고 안전하지 않은 모듈에 대해 뭔가를 발견했다. 나는 이것이 정말로 문제인지 확실하지 않다.
내가 트레드를 호출하는 방식 또는 인수를 제공하는 방식이 잘못되었다고 생각합니다. 나는 그걸로 나를 도울 수 있기를 바래? 나는 안전하고 안전하지 않은 모듈에 대해서도 발견했다. 나는 이것이 정말로 문제가되는지 확실하지 않다. 사전에 감사한다.
[문서는은'threads' 프라 그마 (https://perldoc.perl.org/threads.html) 명확하게 create' '에 첫 번째 매개 변수의 이름이 포함 된 문자열이어야합니다 말한다 스레드에 대한 코드를 제공하는 서브 루틴 또는 해당 서브 루틴에 대한 참조 다음 매개 변수는 호출 매개 변수로 서브 루틴에 직접 전달됩니다. 해당 옵션 중 하나가 아닌 컴파일되지 않은 Perl 코드 문자열을 전달했습니다. 또한,'goldstandard -> morpheus_tagging'은 문자열'goldstandard'를 첫 번째 매개 변수로 전달하는 클래스 메소드 호출입니다. – Borodin