perl: длительные задержки при повторных системных вызовах - PullRequest
0 голосов
/ 13 июля 2020

не уверен, что это проблема perl, проблема cywin или проблема Windows:

Я использую perl внутри cygwin под Windows8. У нас есть огромное количество небольших сценариев для отдельных задач, и я недавно написал сценарий верхнего уровня, который неоднократно вызывает некоторые из этих сценариев с помощью «системных» вызовов. Все скрипты сами по себе работают безупречно, однако выполнение происходит только по частям, т.е. скрипт верхнего уровня начинает работать, и примерно через 10 секунд он останавливается, и компьютер простаивает еще 10-15 секунд, затем запускается снова в течение 10 секунд, и так далее. Помимо этого скрипта, P C выполняет только обычные Windows фоновые процессы, т.е. скрипт верхнего уровня - единственный процесс, вызывающий значительную нагрузку на ЦП.

Скрипт слишком длинный, чтобы показывать здесь, но по существу состоит из структур, в которых несколько переменных определены в циклах, а затем объединены с помощью строк sprintf для вызова сценариев, как в следующем фрагменте:

(...)
foreach $period (@periods)
{
    foreach $wt (@wtlist)
    {   
        foreach $type ('WT', 'Ref')
        {
            $out=1;
            $dir1=0*$sectorwidth;
            $dir2=1*$sectorwidth;
            $addfile0 = sprintf("%s/files/monthly_recal/%s%s_from%s.%s_%03d.da1", $workingdir_correl, $nameRoot, $wt, $type, $period, $dir1 ) ;
            $addfile1 = sprintf("%s/files/monthly_recal/%s%s_from%s.%s_%03d.da1", $workingdir_correl, $nameRoot, $wt, $type, $period, $dir2 ) ;
            if (-e $addfile0 && -e $addfile1)
            {
                $cmd = sprintf ( "perl ../00Bin/add_sort_ts.pl $addfile0 $addfile1 %s/files/monthly_recal/tmp/%s%s_from%s.%s.out%02d 0 $timeStep\n", $workingdir_correl, $nameRoot, $wt, $type, $period,  $out ) ;
                print ($cmd);
                system ( $cmd ) ;
            }
        }
    }
}
(...)

Все переменные определены (простые строки или целые числа) и все индивидуальные вызовы работают.

Когда этот сценарий верхнего уровня выполняется, он выполняет несколько l oop итераций за другой, поэтому я не думаю, что дело в задержках запуска вызываемых сценариев. Мне кажется, что Windows отклоняет слишком много системных вызовов подряд. У меня есть другие perl сценарии без «системных» вызовов, которые выполняются в течение 10 минут, не демонстрируя этого прерывистого поведения.

Я не знаю, где искать, поэтому любое предложение приветствуется. Все время выполнения сценария верхнего уровня может занять несколько часов, поэтому любое улучшение здесь значительно повысит эффективность!

- ОБНОВЛЕНИЕ: Из обсуждения ответа Хакона ниже выяснилось, что проблема заключается в оболочке который используется для запуска сценариев perl - прерывистая операция появляется, когда код запускается из Windows cmd или оболочки без входа в систему, но не при явном запуске из оболочки входа (например, при использовании bash --login или глядя mintty -). Я скоро открою еще одну ветку, чтобы прояснить, почему это происходит ... Спасибо всем участникам!

1 Ответ

0 голосов
/ 14 июля 2020

Не могли бы вы немного упростить вашу задачу? Это поможет легче определить местонахождение проблемы. Например, следующий код, работающий на Windows 10, Strawberry Perl 5.30 (запущенный из CMD, а не Cygwin), не показывает проблем:

use strict;
use warnings;
for my $i (1..10) {
    system 'cmd.exe /c worker.bat';
}

с простым worker.bat вроде:

@echo off
echo %time%
timeout 5 > NUL
echo %time%

Результат выполнения сценария Perl:

10:35:00.71
10:35:05.18
10:35:05.22
10:35:10.17
10:35:10.22
10:35:15.15
10:35:15.19
10:35:20.19
10:35:20.23
10:35:25.15
10:35:25.20
10:35:30.16
10:35:30.21
10:35:35.14
10:35:35.18
10:35:40.16
10:35:40.20
10:35:45.16
10:35:45.21
10:35:50.15

Отсутствие задержек между вызовами system.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...