首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POE抱怨POE::内核的run方法从未在我分叉时被调用

POE抱怨POE::内核的run方法从未在我分叉时被调用
EN

Stack Overflow用户
提问于 2010-12-31 17:03:41
回答 2查看 713关注 0票数 1

这是我的密码:

代码语言:javascript
复制
 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;
      }

当$DAEMON =1时,它会抱怨POE::内核的run()方法从未被调用,但是正如您在上面的代码中看到的那样,我已经这样做了。在守护进程模式下,脚本运行得非常好,但我无法摆脱这个警告,也无法理解它为什么这么说。我还试着调用$poe_ make >has(),这也没有什么区别。

我没有主意了。有什么建议吗?

更新为添加:也许我不够清楚。下面的代码创建会话并运行内核。

代码语言:javascript
复制
_create_sessions($self, $settings);
$poe_kernel->run;

它工作得很好。只有当相同的代码在叉子内部运行以便我可以将脚本发送到后台时,它才会声明POE::内核的run方法没有被调用。脚本确实会进入后台,并按应有的方式工作,这意味着内核确实在运行。我只想摆脱那个恼人的警告。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-01 08:05:53

是对的。之所以会出现警告,是因为POE::Session实例是在父进程中创建的,但没有给它们运行的机会。

代码语言:javascript
复制
% 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是检测到问题的进程ID。

它类似于Perl关于使用活动线程退出的警告:

代码语言:javascript
复制
% 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::内核->has()。我不知道这是否发生在您的代码片段中。

正确的解决方案是在去功能化时将所有会话实例化移动到子进程中。一个可行的解决方法是在使用POE::内核之后,在实际创建任何会话之前调用POE::内核->run()。run()将立即返回,因为不存在会话,但是调用满足了警告您的条件。这是一种说“是的,是的,但我知道我在做什么”的方式。

票数 2
EN

Stack Overflow用户

发布于 2010-12-31 17:57:43

从文件POE::内核的运行通常被称为一个类方法;什么是$poe_kernel?

在某个地方,您似乎要启动一个会话,但不要以调用POE::内核->run()结束;

更新:由于您看到的消息是带有warn的输出,并且在子节点中丢弃了STDERR,所以我猜这是发出警告的父消息。您正在做的事情(在代码中没有显示加载POE并设置$poe_kernel?)实际上是在创建一个会话,显然是无意的。

尝试将您的代码简化为一个简短但可运行的示例,您将自己发现问题,或者让其他人帮助您找到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4571307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档