Разветвление для запуска кода в дочернем процессе с помощью Perl's Dancer

У меня есть приложение Dancer на Perl, которое обрабатывает запросы на получение/публикацию.

Один из моих примеров маршрутов приведен ниже:

post '/handle_data' => sub {

    # perform some calculations
    ...
    # store some data
    ...
    # do some long running tasks
    ...
};

Мой вопрос: есть ли простой способ выполнять длительные задачи в другом процессе, не блокируя запрос?

Я пробовал fork and return в родительском процессе с exit после длительных задач для дочернего элемента, но все это, похоже, блокирует отправку ответа до тех пор, пока дочерний процесс не завершится.

Любая помощь приветствуется.

ИЗМЕНИТЬ:

В итоге я перешел на полноценный сервер заданий, а именно на Perl-версию Gearman.


person Blaskovicz    schedule 28.11.2012    source источник


Ответы (1)


вилка и возврат, кажется, работают для меня.

Я попытался:

#!/usr/bin/perl

use Dancer;

get '/' => sub {
    fork and return "Content!\n";

    sleep 10; # do your actual work here
    warn "Child process done\n";
    exit;
};

dance;

Запуск этого через автономный сервер или через plackup/Starman работает, как и ожидалось - "Content!\n" немедленно возвращается в браузер пользователя, и запрос завершается; разветвленный процесс зависает в течение десяти секунд в спящем режиме, затем выдает предупреждение (видимое на терминале) и завершается.

person David Precious    schedule 28.11.2012
comment
Путем отладки методом проб и ошибок это работает так, как я и думал. Моя проблема заключалась в том, что я распечатывал отладочную информацию перед заголовками ответов... :) - person Blaskovicz; 29.11.2012
comment
У меня есть вопрос по этому поводу: это разветвляет весь процесс танцора или только функцию под маршрутом? Я не знаком с потоками в Perl, но я использую Dancer для многих проектов, и это может когда-нибудь пригодиться. - person Demnogonis; 29.11.2012
comment
Он разветвляет весь процесс; вот почему вам нужен exit в моем примере, иначе этот разветвленный дочерний процесс, как только он покинет обработчик маршрута, может зависнуть в ожидании нового соединения. - person David Precious; 29.11.2012
comment
@DavidPrecious У меня проблема с разветвлением и выходом ... Я вижу, что многие работники по удалению указаны как несуществующие, как только я начинаю использовать этот метод. - person Blaskovicz; 10.12.2012
comment
@Blaskovicz Это потому, что жнеца нет. Что-то вроде этого должно обрабатывать это асинхронно $SIG{CHLD} = sub { wait }; - person Daniel; 16.10.2014