Perl с libxml молча вылетает в Windows 10 внутри цикла с вилкой - PullRequest
2 голосов
/ 18 марта 2019

Я использую Perl 5.24.4 под Windows 10, на котором установлена ​​последняя версия LibXML (2.0134).Ниже приведен код, который дает сбой в Windows 10 (работает в Linux)

crash.pl

use strict;
use warnings;

use XML::LibXML;
use Utils;
use Log::Log4perl;


Log::Log4perl->init('logger.conf');
my $logger = Log::Log4perl->get_logger();

sub generate_word_stats_for_chunk
{
    return Utils::load_sql();
}

my $num_process = 4; 
my @modes = (1,3,5);

foreach my $mode (@modes) {


    my @pid_list;
    $logger->info("Forking $num_process");
    for my $i (0 .. $num_process - 1) {
        my $pid = fork();
        $logger->logconfess("Unable to fork $!") if not defined $pid;
        if ($pid == 0) {
            # child process
            generate_word_stats_for_chunk($i);
            sleep 2;

            # make sure that the child process exit
            exit;
    }
    # parent
    # Store the PIDs, so that waitpid() can call them later
    push @pid_list, $pid;
}

for my $pid (@pid_list) {
    waitpid $pid, 0;
}
$logger->info("finished mode $mode");

Utils.pm

package Utils;

use strict;
use warnings;

use XML::LibXML;
use Log::Log4perl;

my $logger = Log::Log4perl->get_logger();

sub load_sql 
{

    $logger->info("parsing XML");   
    my $dom;

    eval {
        $dom  = XML::LibXML->load_xml(location => 'sql.xml');
    };
    if ($@) {
        $logger->error("parse error $@");
        return;
    }
    $logger->info("finished parsing XML");  

    # dummy
    return {};
}

# perl package ends with 1
1;

sql.xml

<?xml version="1.0" encoding="UTF-8"?>    
<sqls>    
    <sql name="CREATE_COMMODITY_META">
        test
    </sql>      
</sqls> 

Запуск crash.pl дает мне следующий вывод

INFO main::(crash.pl:37) Forking 4
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:31) finished parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:31) finished parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:31) finished parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:31) finished parsing XML
INFO main::(crash.pl:62) finished mode 1
INFO main::(crash.pl:37) Forking 4
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML
INFO Utils::load_sql(Utils.pm:21) parsing XML

Код работает, если я удаляю оператор Utils::load_sql().Это может быть похоже на Почему Perl вылетает при использовании LibXML после разветвления? , но у меня есть некоторые сомнения, так как код в этом посте работает только на машине.Мой код на самом деле работает, если вы удалите внешний цикл (например, foreach my $mode...).Еще одна причина, по которой я сомневаюсь, в том, что посту уже 8 лет.

Кроме того, почему оператор eval в Utils.pm не улавливает сбой?

...