加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中,在属性中保留对Catalyst的$c的引用会导致内存泄漏吗?

发布时间:2020-12-15 21:47:01 所属栏目:大数据 来源:网络整理
导读:我开始使用Catalyst编写一些Perl代码,如下所示: package My::Controller;extends 'Catalyst::Controller';sub handler :Path :Args(0) :Location( some/url ) my ($self,$c) = @_; $self-do_something_with_arguments($c); $self-make_a_decision($c); $sel
我开始使用Catalyst编写一些Perl代码,如下所示:
package My::Controller;
extends 'Catalyst::Controller';

sub handler :Path :Args(0) :Location( some/url )
    my ($self,$c) = @_;

    $self->do_something_with_arguments($c);
    $self->make_a_decision($c);
    $self->another_method($c);
}

然后我想. o(为什么一直传递$c?),我改为:

package My::Controller;
extends 'Catalyst::Controller';

has c => (is => "rw",isa => "Catalyst");

sub handler :Path :Args(0) :Location( some/url )
    my ($self,$c) = @_;
    $self->c($c);

    $self->do_something_with_arguments;
    $self->make_a_decision;
    $self->another_method;
}

处理程序只有一个入口点,因此$self-> c将始终正确设置.

我的同事说,如果这就是Catalyst的意思,那么,每个人都会这样使用它.他们担心这样做会导致内存泄漏,因为在请求结束后对$c的引用会持续存在.真的吗?

解决方法

这并不是大多数人想到的“内存泄漏”,因为它不会导致无限制的内存增长,但是,是的,您将请求上下文保持的时间长于其普通生命周期.它会在您下次提出将$self-> c设置为其他内容的请求时释放,但不会更快.更重要的是,它几乎只是错误的设计.要么继续传递上下文作为参数;或者将您的控制器方法转换为私有操作,并使用 – > forward(自动传递上下文)调用它们;或者在适当的情况下将事物移入模型中,并使用模型ACCEPT_CONTEXT.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读