我有以下代码。我想在starman服务器收到HUP信号时调用$pub->close
方法。
我希望在孩子重新启动之前进行清理,如果我没有,则子进程将阻止。
这是我使用的.psgi文件。
use ZMQ;
use ZMQ::Constants ':all';
use Plack::Builder;
our $ctx = ZMQ::Context->new(1);
my $pub = $ctx->socket(ZMQ_PUB);
$pub->bind('tcp://127.0.0.1:5998');
# I want to close the socket and terminate the context
# when the server is restarted with kill -HUP pid
# It seems the children won't restart because the sockets isn't closed.
# The next two lines should be called before the child process ends.
# $pub->close;
# $ctx->term;
builder {
$app
}
答案 0 :(得分:2)
PSGI应用程序没有标准的方法来注册每个进程的清理处理程序,而Starman似乎没有实现任何可直接使用的东西。但是,当进程退出时,你可以通过修补Starman来运行一些代码。
由于Starman基于Net :: Server :: PreFork并且不使用child_finish_hook()本身,您可以通过将此插入.psgi文件中来覆盖此Net :: Server :: PreFork挂钩:
sub Starman::Server::child_finish_hook {
$pub->close();
$ctx->term();
}
使用END块进行清理(或者只是依赖于全局析构函数)可能会被ZMQ内部使用线程以某种方式阻止,我认为将信号处理留给Net :: Server框架是最明智的。