Perl多线程 - 线程不会启动

时间:2016-05-10 18:59:45

标签: multithreading perl

我需要一些帮助,我无法弄清楚为什么我的线程不想启动。我没有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";
}

2 个答案:

答案 0 :(得分:1)

很难确切地说出你遇到这个问题的原因 - 主要的可能性似乎是:

    $thread = $request[3];
    if ($thread == 1){

这是来自文件句柄的输入,因此真正的可能性是“$ request [3]”实际上不是1

我有点怀疑 - 你的代码在use strict; use warnings位于顶部,但你没有声明,例如$thread$flowmy。这或者意味着你使用strict,或者你正在重复使用变量 - 这是一个很好的方法来结束烦人的故障(比如这个)。

但是就目前而言 - 我们无法肯定地告诉你,因为我们无法重现问题来测试它。为此,我们需要一些示例输入和MCVE

要扩展有关评论中所做主题的观点 - 您可能会看到警告他们“不鼓励”。造成这种情况的主要原因是因为perl线程与其他语言中的线程不同。它们不是轻量级的,在其他语言中也是如此。对于特定类型的问题,它们是完全可行的解决方案 - 特别是那些需要与基于fork的并发模型相比具有更多IPC并行性的解决方案。

答案 1 :(得分:0)

我怀疑你遇到了this bug,修正了Perl 5.24。

如果是这样,你可以通过执行自己的解码而不是使用编码层来解决它。