Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl Starman收到HUP时,ZMQ插座会阻塞_Perl_Zeromq_Plack_Starman - Fatal编程技术网

Perl Starman收到HUP时,ZMQ插座会阻塞

Perl Starman收到HUP时,ZMQ插座会阻塞,perl,zeromq,plack,starman,Perl,Zeromq,Plack,Starman,我有以下代码。当starman服务器接收到HUP信号时,我想调用$pub->close方法 我如何知道子进程结束 我可以用一个结束{}块吗?我试过这个,当plackup重新启动(编辑后)时,它似乎起作用。我和starman试过了。我发出了HUP信号,但孩子们没有重新启动 我应该为HUP安装信号处理程序吗?这是怎么回事 我想在子进程重新启动之前进行清理,否则子进程将阻塞 这是我使用的.psgi文件 use ZMQ; use ZMQ::Constants ':all'; use Plack::B

我有以下代码。当starman服务器接收到HUP信号时,我想调用
$pub->close
方法

  • 我如何知道子进程结束
  • 我可以用一个结束{}块吗?我试过这个,当plackup重新启动(编辑后)时,它似乎起作用。我和starman试过了。我发出了HUP信号,但孩子们没有重新启动
  • 我应该为HUP安装信号处理程序吗?这是怎么回事
我想在子进程重新启动之前进行清理,否则子进程将阻塞

这是我使用的.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
}

PSGI应用程序没有标准的方法来注册每进程清理处理程序,Starman似乎也没有实现任何直接可用的东西。但是,您可以在进程退出时使用猴子补丁Starman来运行一些代码

由于Starman基于Net::Server::PreFork,并且不使用子_finish_hook()本身,因此您可以通过在.psgi文件中插入以下内容来覆盖此Net::Server::PreFork钩子:

sub Starman::Server::child_finish_hook {
    $pub->close();
    $ctx->term();
}

ZMQ内部使用线程可能会以某种方式阻止使用结束块进行清理(或者仅仅依赖于全局析构函数),我认为最好将信号处理留给Net::Server框架

这段代码是在服务器端还是在客户端?您是否研究过实现SIGHUP处理程序(这可能只有在您控制服务器端时才起作用)?此代码在Starman中运行服务器端。我希望能够发送HUP信号,并使服务器重新加载。这是为Starman设计的。问题是孩子们没有重新启动,因为套接字没有关闭。如何启动服务器?使用
plackup
默认是在分叉之前在主进程中运行psgi文件,使用
starman
默认是在子进程中运行psgi文件。在psgi文件中分配资源时,这一差异可能非常重要。我把它改成了Starman。我的启动文件中似乎有一个-R。这使得Starman预加载了.psgi文件。我删除了-R,并在绑定和连接中添加了错误检查。此外,我还使用了STARMAN_DEBUG=1,并从绑定中遇到了一些错误消息。