首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl线程过多使用内存

Perl线程过多使用内存
EN

Stack Overflow用户
提问于 2014-11-11 10:32:10
回答 1查看 255关注 0票数 0

我编写了一个永久作为守护进程运行的Perl脚本。

代码语言:javascript
复制
my $CHILD_THREADS_CNT=5;

my  $q= new Thread::Queue();

sub processJob{
    while (defined(my $taskHandle = $q->dequeue()) ) {
        my $obj=jobProcesser->new();
        my $result=$obj->getOutput(taskHandle);
        #jobProcessor is the large modules that computes/manipulates the job
        //MySql Query to insert '$result' into DB
    }
}

#Daemon subroutine
sub daemon{
    while (1){
        my @new_request=   #'My SQL Queries that returns all  new requests from db'
        for (@new_request){
            $q->enqueue($_);
        }
        sleep 5;
    }
}
#Main thread scans the db, and, enqueue the new job in a queue.
my $scanDB=threads->create(\&daemon);

#children perform processing
my  @child=map threads->create(\&processJob), 1..CHILD_THREADS_CNT;

$scanDB->join;
$q->enqueue(undef) for 1..CHILD_THREADS_CNT;
for (@child){
    $_->join;
}

我使用nohup在unix(Perl v5.8.8)中运行这个脚本。剧本每隔4-5天就会死一次。没有hup不捕获解释脚本突然死亡的原因的日志(主进程)。我预见到内存泄漏,并使用顶级-p PID来分析nohup过程。

随着脚本的持续和永久运行,VIRT(虚拟内存)和RES内存大小不断增长。仅在10小时内就达到了2GB左右的水平。

本质上,一旦子线程完成作业(Process),即。returns $result,那么内存应该已经被释放到操作系统了。

  • 我的线程实现内存有效吗?
  • 需要什么更改和优化才能永远运行脚本,不中断,或者不定期重新启动?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2014-11-11 11:10:13

正如评论中提到的,这里没有明显的漏洞。

通过从队列中运行'worker‘线程,您已经避免了线程编程中的一些关键“问题”。

我建议您查看一下数据库调用和在processJob子中创建对象时发生了什么。OO中的常见陷阱是在对象内创建循环引用,因此即使对象超出作用域,参考计数也不会降到零。

如果调用析构函数,则可能值得检查。(http://perldoc.perl.org/perlobj.html#Destructors)

代码语言:javascript
复制
DESTROY { 
    my ( $self ) = @_; 
    warn $self . " object destroyed";
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26862768

复制
相关文章

相似问题

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