Perl IPC - FIFO и демоны и загрузка процессора - PullRequest
1 голос
/ 21 января 2011

У меня есть Perl-скрипт почтового парсера, который вызывается каждый раз, когда пользователю приходит почта (используя .qmail).Он извлекает вложение из календаря из почты и помещает «путь» файла в очередь FIFO, реализованную с использованием модуля Directory :: Queue .

Другой perl-скрипт, который считывает путь вложения календаря и выполняет определенные файловые операции в локальной системе, а также на удаленном сервере CalDAV, запускается как демон, как объяснено здесь .Так что в основном этот скрипт выглядит так:

my $declarations

sub foo {
.
.
}

sub bar {
. 
. 
}

while ($keep_running) {
    for(keep-checking-the-queue-for-new-entries) {

        sub caldav_logic1 {
        .
        .
     }
        sub caldav_logic2 {
        .
        . 
    }
  }
}  

Я использую Proc :: Daemon для запуска скрипта в качестве демона.Теперь проблема в том, что этот процесс использует процессор почти на 100%.Каковы предлагаемые способы реализации демона более стандартным и безопасным способом?Я использую в значительной степени тот же код, который упоминался в ссылке, упомянутой для использования Proc :: Daemon.

Ответы [ 3 ]

3 голосов
/ 22 января 2011

Бьюсь об заклад, это ваш цикл for и проверка новых записей в очереди.

Существуют способы просмотра каталога на предмет изменений файла.Эти способы зависят от ОС, но, возможно, существует модуль Perl, который обернет их для вас.Используйте это вместо занятого зацикливания.Даже с задержкой в ​​спящем режиме зацикливание неэффективно, когда вы можете точно указать, когда программа должна выйти из состояния ОС.

File :: ChangeNotify выглядит многообещающе.

1 голос
/ 12 сентября 2011
cpan Linux::Inotify2

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

1 голос
/ 21 января 2011

Может быть, вы не хотите действительно непрерывного опроса.Является ли keep-checking-the-queue-for-new-entries ресурсоемкой частью кода, даже если очередь пуста?Это объясняет, почему ваш процессор всегда занят.

Попробуйте поместить оператор sleep 1 в самый верх (или в самый низ) цикла while, чтобы процессор мог отдохнуть между проверками очереди.Если это не сильно снижает производительность программы (т. Е. Если каждый может терпеть ожидание дополнительной секунды перед обновлением календарей компании) и если загрузка ЦП все еще кажется высокой, попробуйте sleep 2, sleep 5 и т. Д.

...