Perl-скрипт, выполняющий периодическую (основную) задачу и предоставляющий интерфейс REST - PullRequest
1 голос
/ 26 октября 2019

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

# ... initialization...

while(1) {
    # ... scan filesystem, perform actions depending on changes detected ...
    sleep 5;
}

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

Пока я уже использовалфреймворк Dancer2 один раз, но у него есть вызов start;, который блокирует и, следовательно, не позволяет запускать какие-либо другие задачи (например, мой цикл). Кроме того, я, конечно, мог бы переместить код, который в настоящее время находится внутри цикла, в конечную точку, доступную через Dancer2, но тогда мне нужно будет периодически вызывать ее (хотя внешняя программа?), Что кажется довольно неясным косвенным обращением по сравнению с простоесли веб-часть сервера работает в фоновом режиме.

Можно ли ненавязчиво (т.е. не блокировать программу) добавить возможность REST-сервера в сценарий Perl? Если да: какие модули будут использоваться для этой цели? Если нет: Должен ли я действительно реализовывать внешний процесс, чтобы периодически вызывать определенную конечную точку или использовать другое решение?

(Я пытался добавить тег dancer2, но не смог сделать это из-за недостаточной репутацииНе вводите в заблуждение этим: я до сих пор пробовал только с Dancer2, а не с Dancer (v.1))

1 Ответ

1 голос
/ 29 октября 2019

Вы можете попробовать запустить цикл обработки в фоновом потоке, прежде чем запускать start;.

См. man perlthrtut

Возможно, вы хотите use threads::shared; объявить некоторые переменные общимимежду частью REST и фоновым потоком. Или используйте выделенные очереди / механизмы событий.

...