我需要一些帮助,我无法弄清楚为什么我的线程不想启动。我没有perl的经验,并被要求制作一个逐行处理文件的脚本。根据行,进程应执行其他功能(不在代码段中),在新文件上调用相同的函数或在并行(线程)的新文件上调用相同的函数。
下面,我粘贴了一段实际代码(删除了不相关的代码)。
我在一个名为" test"的函数上测试多线程部分。应打印"确定"。
流程正确执行,"启动"打印,然后它被卡住,并在短暂的延迟后,该过程完全停止执行。
感谢任何可以帮助我的人!
use strict;
use warnings;
use IO::Prompter;
use Getopt::Long;
use Log::Message::Simple;
use File::Basename;
use File::Spec;
use IO::Socket::INET;
use UUID::Tiny ':std';
use threads;
use threads::shared;
# *bunch of code deleted*
process_file( $cmdline{csvfile}, 1 );
sub test {
print "ok\n";
}
sub process_file {
# get parameters
my ( $input_file, $flowid ) = @_;
# init variables
# open input file
open( my $fh, '<:encoding(UTF-8)', $input_folder . $input_file )
or die "Could not open file '$input_file' $!";
# process file
while ( my $row = <$fh> ) {
chomp $row;
@request = split ";", $row;
$flow_type = $request[0];
$flow = $request[1];
# *bunch of code deleted*
$filename = "$flow.csv";
$keep_flowid = $request[2]; # keep flowid?
$tmp_flowid = $keep_flowid ? $flowid : undef; # set flowid
$thread = $request[3];
if ( $thread == 1 ) {
### Create new thread
print "start\n";
my $process_thread = threads->create("test");
$process_thread->join();
}
elsif ( $thread == 0 ) {
# wait on process to complete
process_file( $filename, $tmp_flowid );
}
# *bunch of code deleted*
}
# close file
close $fh or die "Couldn't close inputfile: $input_file";
}
答案 0 :(得分:1)
很难确切地说出你遇到这个问题的原因 - 主要的可能性似乎是:
$thread = $request[3];
if ($thread == 1){
这是来自文件句柄的输入,因此真正的可能性是“$ request [3]”实际上不是1
。
我有点怀疑 - 你的代码在use strict;
use warnings
位于顶部,但你没有声明,例如$thread
,$flow
等my
。这或者意味着你不使用strict
,或者你正在重复使用变量 - 这是一个很好的方法来结束烦人的故障(比如这个)。
但是就目前而言 - 我们无法肯定地告诉你,因为我们无法重现问题来测试它。为此,我们需要一些示例输入和MCVE
要扩展有关评论中所做主题的观点 - 您可能会看到警告他们“不鼓励”。造成这种情况的主要原因是因为perl线程与其他语言中的线程不同。它们不是轻量级的,在其他语言中也是如此。对于特定类型的问题,它们是完全可行的解决方案 - 特别是那些需要与基于fork
的并发模型相比具有更多IPC并行性的解决方案。
答案 1 :(得分:0)
我怀疑你遇到了this bug,修正了Perl 5.24。
如果是这样,你可以通过执行自己的解码而不是使用编码层来解决它。