Как определить обработчик появления для Mojo::Server::Prefork?

У меня есть простое веб-приложение, написанное на Perl/Mojolicious и работающее под hypnotoad.

Мне нужно определить обработчик для события "spawn" (выдаваемого Mojo::Server::Prefork).

Но я не знаю, как вставить это определение обработчика в код метода запуска приложения Mojolicious. $self->on("spawn"=>sub {}) не работает :( А Dumper($self) вообще не помогло: нет ни $self->server, ни $server->prefork...

Подскажите пожалуйста, как это сделать.

Спасибо!


person drvtiny    schedule 10.04.2017    source источник
comment
Сервер не является приложением. Он находится перед приложением. Объект Hypnotoad содержит ваш объект Mojo::Server::Prefork. Я не уверен, что вы можете достичь этого из приложения. См. metacpan.org/pod/Mojo::Server::Hypnotoad#prefork — из просмотра кода Я думаю, вам придется реализовать подкласс либо Mojo::Server::Prefork, либо Mojo::Server::Hypnotoad и поместить туда свой обработчик on("span"), а затем заставить Hypnotoad использовать его. Но я не понимаю, как. Недостаточно знаком с Mojo, извините.   -  person simbabque    schedule 10.04.2017
comment
Хм... Может быть, вы знаете, как запускать какой-то код в hypnotoad worker всякий раз, когда он появляется? Я попробовал Mojo::IOLopp-›next_tick, как описано в документации Mojo, но, похоже, это не работает.   -  person drvtiny    schedule 10.04.2017
comment
Боюсь, что нет. Я только что прочитал документацию и взглянул на код. Я могу заглянуть еще немного позже, но я никогда не использовал этот материал.   -  person simbabque    schedule 10.04.2017


Ответы (1)


Хотя я до сих пор не знаю, как определить обработчик, запущенный в процессе "порождения", я могу сказать, что абсолютно то же самое можно сделать с помощью

Mojo::IOLoop->singleton->next_tick(sub {
  doingSomethingOnProcSpawn()
});

Как описано в поваренной книге Mojolicious (http://mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Pre-forking):

Во время запуска ваше приложение предварительно загружается в процесс менеджера, который не запускает цикл событий, поэтому вы можете использовать «next_tick» в Mojo::IOLoop для запуска кода всякий раз, когда новый рабочий процесс разветвляется и его цикл событий запускается.

Подсказка: как я вижу в моем реальном приложении, Mojo::IOLoop->singleton->next_tick и Mojo::IOLoop->next_tick работают абсолютно одинаково, поэтому я не знаю, в чем между ними разница.

person drvtiny    schedule 13.04.2017