не уверен, что это проблема 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 -
). Я скоро открою еще одну ветку, чтобы прояснить, почему это происходит ... Спасибо всем участникам!