【问题标题】:Setting an alarm in a role在角色中设置警报
【发布时间】:2011-09-22 20:47:24
【问题描述】:

我有一堆类在网络上执行不同的操作,众所周知,网络操作有时会超时。所以我正在考虑做这样的事情:

package My::Role::NetworkFetcher { 
    use Moose::Role;

    sub BUILD { 
        my $self = shift;
        local $SIG{ALRM} = sub { 
            $self->handle_timeout;
        };

        alarm 60;
    }

    sub handle_timeout { 
        die "default timeout handler";
    }

}

我不确定这是否是解决此问题的最佳方法。 似乎在我非常简单的测试用例中工作正常,但我不确定以这种方式劫持对象的 BUILD 方法或本地化信号处理程序是否正确甚至可取。

【问题讨论】:

    标签: perl oop ipc moose alarm


    【解决方案1】:

    这里要小心。 local $SIG{ALRM} 仅适用于 BUILD 方法,因此如果您离开函数范围而不调用 alarm 0,则默认 ALRM 处理程序如果您离开 BUILD 方法并且发生超时,则会发生这种情况。在 eval 中完成整个事情是最安全的,这样您就不会遇到晦涩难懂的问题。

    【讨论】:

    • 这实际上是我的意图——基本上这些是执行从队列中进入的某些作业的类,每个进程一个。我想以这样的方式设置超时,如果作业花费超过一分钟,进程就会终止并记录错误。
    • 那你就不用担心了。你发布的内容在我看来不错。
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多