从 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 线程中干净地退出的主要内容,如果未能解决你的问题,请参考以下文章