LWP和IO::Socket在threads下的情况,LWP内存不正常

LWP和IO::Socket在threads下的情况,LWP内存不正常

测试脚本:

#!/usr/bin/perl

 
use strict;
use IO::Socket;
use LWP::UserAgent;
use threads;

my $host = "bbs.chinaunix.net";
my $html = "";
my $use = "LWP"; # 这里填 LWP 或 Socket,分别测试 LWP 和 Socket 在 threads 下的工作情况

my $uselock = "lock.txt"; # 为了测试加锁,限制只开一条线程

unlink ("$uselock");

while( 1 ){

if (!-e "$uselock") {
my $thread = threads->create('test');
$thread->detach();
}
sleep 3;

}

sub test {

if ($use eq "LWP") {

open (FILE, ">$uselock");close (FILE);
print "LWP start\n";

my $ua = LWP::UserAgent -> new;
$ua -> timeout( 30 );
$ua -> agent( 'Mozilla/4.76 [en] (Win98; U)' );
$ua -> default_header( 'Pragma' => 'no-cache', 'Accept' => '*/*');

my $resp = $ua -> get( "http://$host/" );
if ( $resp -> is_success )
    {
    $html = $resp->status_line ."\n\n";
    $html .= $resp->headers_as_string ."\n\n";
    $html .= $resp -> content;
    }

unlink ("$uselock");
print "LWP end\n";

}


if ($use eq "Socket") {

open (FILE, ">$uselock");close (FILE);
print "Socket start\n";

my $geturl=qq~GET / HTTP/1.1
Accept: */*
User-Agent: Mozilla/4.76 [en] (Win98; U)
Host: $host
Connection: Keep-Alive

~;

my $socket = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$host", PeerPort=>80, Timeout => 30);
#$socket->autoflush(1);

my @html;
if($socket){
print $socket "$geturl";
@html=<$socket>;
close($socket);
}else{
}
$html = join("",@html);

unlink ("$uselock");
print "Socket end\n";

}

}


具体情况,
一直观察脚本占用内存的情况,(一直到几分钟后)两种方式的脚本占用内存的情况:
发现 LWP 每一次访问网络断开后,脚本占用的内存都会添加一点,几K或几十K一直增长,
而 IO::Socket::INET 每次访问网络断开后,脚本占用的内存都恢复正常,不会一直增长。
只是 IO::Socket::INET 每次访问网络(获得网站内容)的时间都比 LWP 慢很多,至少慢10秒以上。

这是什么原因呢?请问有办法解决吗?

貌似你每次都没有关闭FILE这个句柄, 造成句柄资源的浪费, 也许是这个原因.
关闭FILE了吧。就算没有文件操作,也一样的结果。
似乎threads这个东西也不是很正常哦。
参考一我以前的贴子,"perl线程是鸡肋"
我认为你有时间就自己写个perl线程扩展吧.
Perl线程确实不稳定,写得多线程程序检查了很多遍,还是有时出现内存访问错误,肯定是Perl线程的问题!


QUOTE:
原帖由 rrrrrrrr8 于 2007-10-22 17:58 发表
参考一我以前的贴子,"perl线程是鸡肋"
我认为你有时间就自己写个perl线程扩展吧.

谢谢!不过,写这样的扩展需要用C吧,暂时还没有这个能力呢!
哪位大侠有空帮我们弄一个啊,呵呵。


QUOTE:
原帖由 mslk 于 2007-10-22 23:06 发表
Perl线程确实不稳定,写得多线程程序检查了很多遍,还是有时出现内存访问错误,肯定是Perl线程的问题!

我这个例子已经很简单了哦。
不是检查程序的问题, 是线程确实不稳定.

甚至是没有多线程的程序, 运行在编译时加入的线程支持的perl版本上,都有可能莫名其妙崩溃.