首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Starman接收HUP时ZMQ套接字块

Starman接收HUP时ZMQ套接字块
EN

Stack Overflow用户
提问于 2013-01-23 21:15:28
回答 1查看 317关注 0票数 4

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

  • 我怎么知道子进程结束了?
  • 我可以使用END {}块吗?我尝试过这样做,当plackup重新启动(编辑后)时,它似乎可以工作。我和星人试过了。我发送了HUP信号,但是孩子们没有重新启动。
  • 我应该为HUP安装一个信号处理程序吗?这是如何工作的呢?

我想清理在子进程重新启动之前,如果我不清理,子进程将阻塞。

这是我使用的.psgi文件。

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

回答 1

Stack Overflow用户

发布于 2013-01-24 15:11:37

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

由于Starman基于Net::Server::PreFork,并且不使用child_finish_hook()本身,您只需在.psgi文件中插入以下内容,就可以重写此Net::Server::PreFork钩子:

代码语言:javascript
复制
sub Starman::Server::child_finish_hook {
    $pub->close();
    $ctx->term();
}

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

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

https://stackoverflow.com/questions/14489522

复制
相关文章

相似问题

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