ист прав. Предупреждение возникает из-за того, что экземпляры POE :: Session создаются в родительском процессе, но им не была предоставлена возможность запуска.
% perl -wle 'use POE; POE::Session->create(inline_states=>{_start => sub {}})'
40023: Sessions were started, but POE::Kernel's run() method was never
40023: called to execute them. This usually happens because an error
40023: occurred before POE::Kernel->run() could be called. Please fix
40023: any errors above this notice, and be sure that POE::Kernel->run()
40023: is called. See documentation for POE::Kernel's run() method for
40023: another way to disable this warning.
В приведенном выше примере 40023 - это идентификатор процесса, в котором обнаружена проблема.
Это похоже на предупреждение Perl о выходе из активных потоков:
% perl -wle 'use threads; threads->create(sub { sleep 3600 }); '
Perl exited with active threads:
1 running and unjoined
0 finished and unjoined
0 running and detached
Хотя ваш фрагмент кода показывает, что сеансы создаются и запускаются в дочернем процессе, я подозреваю, что сеансы создаются до или после. Родительский процесс не завершается в вашем фрагменте, поэтому невозможно сказать, где будет выполняться выполнение?
Вы также должны вызвать POE :: Kernel-> has_forked () в дочернем процессе. Я не могу сказать, происходит ли это в вашем фрагменте кода.
Правильное решение - переместить все экземпляры сеанса в дочерний процесс при демонизации. Обходной обходной путь - вызвать POE :: Kernel-> run () сразу после использования POE :: Kernel и до того, как будут созданы какие-либо сеансы. run () вернется немедленно, потому что сеансов не существует, но вызов удовлетворяет условию, о котором вас предупреждают. Это способ сказать «да, да, но я знаю, что я делаю».