Multithreading Perl多线程-线程不';开始
我需要一些帮助,我不明白为什么我的线程不想启动。我没有perl方面的经验,被要求编写一个脚本来逐行处理文件。根据行的不同,进程应该执行其他函数(不是在代码段中)、对新文件调用相同的函数或对新文件并行调用相同的函数(线程) 下面,我粘贴了一段实际代码(删除了不相关的代码) 我正在一个名为“test”的函数上测试多线程部分,该函数应该打印“ok” 进程正确执行,“开始”被打印,但随后它被卡住,在短暂延迟后,进程完全停止执行 万分感谢任何能帮助我的人Multithreading Perl多线程-线程不';开始,multithreading,perl,Multithreading,Perl,我需要一些帮助,我不明白为什么我的线程不想启动。我没有perl方面的经验,被要求编写一个脚本来逐行处理文件。根据行的不同,进程应该执行其他函数(不是在代码段中)、对新文件调用相同的函数或对新文件并行调用相同的函数(线程) 下面,我粘贴了一段实际代码(删除了不相关的代码) 我正在一个名为“test”的函数上测试多线程部分,该函数应该打印“ok” 进程正确执行,“开始”被打印,但随后它被卡住,在短暂延迟后,进程完全停止执行 万分感谢任何能帮助我的人 use strict; use warnings;
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";
}
使用严格;
使用警告;
使用IO::提示器;
使用Getopt::Long;
使用Log::Message::Simple;
使用File::Basename;
使用File::Spec;
使用IO::Socket::INET;
使用UUID::Tiny':std';
使用线程;
使用线程::共享;
#*删除了大量代码*
进程文件($cmdline{csvfile},1);
子测试{
打印“确定”\n;
}
子进程文件{
#获取参数
我的($input_文件,$flowid)=@;
#初始变量
#打开输入文件
打开(我的$fh,很难说清楚你为什么会有这个问题-主要的可能性似乎是:
$thread = $request[3];
if ($thread == 1){
这是从您的文件句柄输入的,所以真正的可能性是“$request[3]”实际上不是1
不过我有点怀疑-你的代码是使用严格的;
在顶部使用警告
,但是你没有用我的声明例如$thread
,$flow
等。这要么意味着你没有使用严格的,要么你在重用变量-这是一个很好的方法,最终会出现恼人的小故障(像这个)
但就目前情况而言,我们无法确定地告诉您,因为我们无法重现问题来测试它。为此,我们需要一些样本输入和
要详细说明注释中关于线程的内容,您可能会看到“不鼓励”线程的警告。主要原因是perl线程与其他语言中的线程不同。与其他语言中的线程不同,perl线程并不轻量级。它们是解决特定问题类的完全可行的解决方案,特别是那些需要比基于fork
的并发模型提供更多IPC并行的问题您。我怀疑您正在经历Perl 5.24中修复的问题
如果是这样,您可以通过执行自己的解码而不是使用编码层来解决这个问题。不幸的是,线程的使用是从Perl 5.20开始的。我喜欢Perl中的线程,尤其是与threads::Queue
一起使用时。然而,测试
函数太小(而且很快)当您对其调用join()
时,它可能已经返回。此外,当您启动线程并等待它们时(使用join
),也无法从中受益从代码来看,我假设你不使用严格的或警告。请这样做。你是否包括使用线程;
?@Perl-Dog,Perl线程工作,它们被维护,并且不会被删除。//如果你不知道如何处理线程太重的问题,它们应该被阻止。在其他方面换句话说,如果你不介意线程花一些时间启动,或者如果你使用的是工人模型,那么使用线程是没有问题的。//基本上,一群人厌倦了看到新手浪费CPU时间(在他们心目中)通过使用线程或不重用线程。@Jonas De Ridder,如果启动线程的成本很高,那么让每个线程执行多个工作单元比为每个工作单元创建一个新线程要快。这是worker poolsHi@Sobrique背后的概念,我在代码中声明了未显示的变量,我确信这不是问题所在当“开始”被打印到控制台时(同样,我使用strict
和警告
,并且没有收到错误消息)。感谢您指出分叉
,我会看一看,如果运气不好,我会创建一个MCVE&sample输入,以便您可以测试线程代码。一个明显的替代方案是:您的命名空间中是否有另一个测试
?如果创建(\&test),会发生什么情况
相反?作为一项规则,在别处声明变量不是一个好的做法-在尽可能小的范围内使用它们,这样可以避免“出血”(例如,变量重用)。