从 Perl 线程中干净地退出

Posted

技术标签:

【中文标题】从 Perl 线程中干净地退出【英文标题】:Exit cleanly from Perl threads 【发布时间】:2012-04-25 06:32:04 【问题描述】:

以下代码的内存消耗在其执行过程中会增加。 可能出了什么问题?我还需要做些什么才能彻底退出线程吗?

#!/usr/bin/perl -w
use strict;    

my  ($i,$URL);
my  @Thread;
my  $NUM_THREADS=4;
my  @response:shared =();
while(1)

    for($i=0;$i<$NUM_THREADS;$i++)
    
         if( $response[$i] is processed)
         
              $URL=FindNextURL();  
              $Thread[$i]=new threads \&Get,$i,$URL;
              $Thread[$i]->detach();
         
    
    # wait for atleast one $response[$i]
    # if ready process it               


sub Get

    my $i=$_[0];
    my $URL=$_[1];        
    $response[$i]=FetchURL($URL);
    return;

【问题讨论】:

你有一大堆全局变量,从我可以告诉意大利面条代码。在尝试任何花哨的东西之前,我会首先尝试控制您代码的这些方面。 只有一个全局变量 - @response。欢迎任何其他不使用全局变量的方法。 $i@Thread$URL 也是全局的。 将它们设置为 main 的本地。 【参考方案1】:

来自http://perldoc.perl.org/threads.html

“在大多数系统上,频繁和持续地创建和销毁线程会导致 Perl 解释器的内存占用不断增加。虽然只需启动线程然后 ->join() 或 -> detach() 它们,对于长期存在的应用程序,最好维护一个线程池,并将它们重用于所需的工作,使用队列来通知线程待处理的工作。此模块包含一个简单示例 (examples/pool_reuse.pl),说明了可重用线程池的创建、使用和监控。"

请尝试进行主题投票。

【讨论】:

以上是关于从 Perl 线程中干净地退出的主要内容,如果未能解决你的问题,请参考以下文章

c#多线程

C# WinForm程序中强制退出程序以及启动程序

C# 退出程序方法

C#程序退出的几种方法

退出清理线程

C# 使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出