Poe beschwert sich darüber, dass Poe :: Kernels Run -Methode nie aufgerufen wurde

StackOverflow https://stackoverflow.com/questions/4571307

  •  14-10-2019
  •  | 
  •  

Frage

Dies ist mein Code:

 if ($DAEMON) {
                my $pid = fork();
                if (not defined $pid) {
                                        print "Unable to start daemon.\n";
                                        exit(1);
                                      }
                elsif ($pid == 0) {
                                   open STDOUT, '>', '/dev/null';
                                   open STDERR, '>', '/dev/null';
                                   _create_sessions($self, $settings);
                                   $poe_kernel->run;
                                  }
                else { print "Script forked to background with PID $pid\n"; }
              }
 else {
        _create_sessions($self, $settings);
        $poe_kernel->run;
      }

Wenn $ Daemon = 1, beschwert sich, dass die Methode von Poe :: Kernel nie aufgerufen wurde, aber wie Sie im obigen Code sehen können, habe ich das bereits getan. Das Skript funktioniert im Daemon -Modus vollkommen in Ordnung, aber ich kann diese Warnung nicht loswerden oder verstehen, warum es das sagt. Ich habe auch versucht, $ poe_kernel-> has_forked () anzurufen, und das hat auch keinen Unterschied gemacht.

Ich habe keine Ideen mehr. Irgendwelche Vorschläge?

Aktualisiert, um hinzuzufügen: Vielleicht war ich nicht klar genug. Der folgende Code erstellt die Sitzung und führt den Kernel aus.

_create_sessions($self, $settings);
$poe_kernel->run;

Es funktioniert vollkommen in Ordnung. Erst wenn der gleiche Code in einem Fork -Kind ausgeführt wird, so dass ich das Skript an den Hintergrund senden kann, heißt es, dass Poe :: Kernels Run -Methode nicht angerufen wurde. Das Skript geht in den Hintergrund und funktioniert so, wie es sollte, was bedeutet, dass der Kernel tatsächlich ausgeführt wird. Ich möchte nur diese nervige Warnung loswerden.

War es hilfreich?

Lösung

ysth hat recht. Die Warnung geschieht, weil Poe :: Session -Instanzen im Elternprozess erstellt werden, aber sie haben keine Gelegenheit, zu laufen.

% 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.

Im obigen Beispiel ist 40023 die Prozess -ID, bei der das Problem erkannt wurde.

Es ähnelt Perls Warnung, mit aktiven Threads zu beenden:

% 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

Während Ihr Code -Snippet zeigt, dass Sitzungen im Kinderprozess erstellt und ausgeführt werden, vermute ich, dass Sitzungen vor oder danach erstellt werden. Der übergeordnete Prozess beendet sich nicht in Ihrem Snippet, sodass keine Ausführung danach führt?

Sie sollten auch Poe :: Kernel-> Has_Forked () im Kinderprozess anrufen. Ich kann nicht sagen, ob das in Ihrem Code -Snippet passiert.

Die korrekte Lösung besteht darin, alle Sitzungsstärke beim Daemonisieren in den Kinderprozess zu verschieben. Eine passable Problemumgehung besteht darin, Poe :: kernel-> run () zu rufen, kurz nachdem er Poe :: Kernel verwendet hat und bevor alle Sitzungen tatsächlich erstellt werden. Run () wird sofort zurückkehren, da keine Sitzungen vorhanden sind, aber der Anruf erfüllt die Bedingung, die Sie gewarnt werden. Es ist eine Art zu sagen "Ja, ja, aber ich weiß, was ich tue".

Andere Tipps

Aus dem DOC wird Poe :: Kernels Lauf normalerweise als Klassenmethode bezeichnet. Was ist $ poe_kernel?

Irgendwo starten Sie eine Sitzung, nennen aber nicht poe :: kernel-> run ();

UPDATE: Da die Nachricht, die Sie sehen, warnt Warn, und Sie werfen Stderr im Kind weg, ich vermute, es ist der Elternteil, der die Warnung gibt. Etwas Sie tun (in dem Code, in dem Sie nicht zeigen, dass Poe geladen wird, und $ poe_kernel?) Erstellt tatsächlich eine Sitzung, anscheinend ungewollt.

Versuchen Sie, Ihren Code auf ein kurzes, aber ausgeführbares Beispiel zu reduzieren, und Sie werden das Problem entweder selbst finden oder anderen ermöglichen, es Ihnen zu helfen, es zu finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top