Самый эффективный способ частого вызова одного и того же исполняемого файла в скрипте - PullRequest
0 голосов
/ 06 марта 2019

как часть проекта, над которым я работаю, мы повторно используем сценарий Perl, который выполняет циклы для некоторых простых задач. Проблема возникает из-за того, что:

  • Скрипт вызывает простой исполняемый файл (в основном читает в реестре), но на частоте ~ 60 Гц
  • Исполняемый файл находится на общем диске
  • Большой каталог, в котором он находится (~ 1000 элементов)

Так что, в принципе, даже если я вызываю исполняемый файл с его полным путем, он все равно анализирует весь каталог, чтобы найти его при каждом вызове, что затопляет сеть.

Какой лучший способ решить это? Предпочтение будет состоять в том, чтобы не изменять архитектуру системы (сохранять exe-файлы на общем диске) и не обходить ее, скажем, reg.exe, чтобы поддерживать совместимость при изменении нашего exe-файла. Я также предпочел бы не переписывать сценарий Perl чем-то другим, но я открыт для этого.

Есть ли способ загрузить исполняемый файл в память процесса для повторного выполнения? Или держать ручку на этом? Есть ли что-то, что можно сделать, используя символические ссылки?

Спасибо

1 Ответ

1 голос
/ 08 марта 2019

Несмотря на то, что трудно обеспечить рабочее решение при отсутствии информации о вашей среде и процессах, я могу сделать несколько общих предложений на случай, если это поможет.

Полагаю, вы работаете под Windows.В этом случае может помочь изменение кода Perl для управления целевым exe-процессом через Win32 :: Process .Этот модуль позволяет создавать, приостанавливать, возобновлять и завершать процессы Windows с учетом пути процесса.

Краткий пример со страницы Meta CPAN:

use Win32::Process;
use Win32;

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

Win32::Process::Create($ProcessObj,
                       "C:\\winnt\\system32\\notepad.exe",
                       "notepad temp.txt",
                       0,
                       NORMAL_PRIORITY_CLASS,
                       ".")|| die ErrorReport();

$ProcessObj->Suspend();
$ProcessObj->Resume();
$ProcessObj->Wait(INFINITE);
...