Thread Speicherleaks bei Arbeiten mit Threads - Lösung? (4 answers)
Opened by Gast at 2005-07-29 20:01

Gast Gast
 2005-07-29 20:32
#56822 #56822
Quote
Hallo,

ich arbeite an einem spider und arbeite mit threads.Für x bis threads_max erstellt er einen thread und startet das scannen in &client_get_links_threads;

wenn max_threads erreicht wird, führt er jeweils join durch ...
wenn ich das script laufen lassen konsumierts soviel speicher das ein Out of Memory kommt.

was mache ich falsch?wie kann ich es verbessern, sodass keine memory leaks mehr auftreten?

MfG


Hier der Code der zum Memory Leak führt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# wenn wir fremde links nicht folgen sollen 
if ( ($follow_flag == "0") && ($is_same == "1") ) {



# tue hier nun was wenn wir nur hostgleiche sachen scannen sollen

print "[$i] Scanning $tmp_url\n";



if ($thread_count < $thread_max) {



push @threads, threads->new(\&CLIENT_get_links_threads, $tmp_url, $i, "threads_links.txt");

$thread_count++;



} elsif ($thread_count == $thread_max){



print "\n&linktiefe_scanner_threads(): Max Threads reached: joining them!\n\n" if ($debug == "1");

foreach (@threads) { eval { $_->join; } or warn $@ if $@; };

$thread_count = "0";



} elsif ($#working_links == $link_count) {



print "\n&linktiefe_scanner_threads(): Last Link in Array - Threads: joining them!\n\n" if ($debug == "1");

foreach (@threads) { eval { $_->join; } or warn $@ if $@; };



}



# ...

# here do something with the links (spider / mirror )

# ...

# wenn wir fremde links folgen sollen
} elsif ($follow_flag == "1"){



hier die subroutine CLIENT_get_links_threads

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
my ($url, $current_depth, $file) = @_;
my ($obj_spider, $html, @links, $link, $tid);

$obj_spider = Spider::Easyspider->new($config);
$html = $obj_spider->http_get($url);
@links = $obj_spider->get_links($html);

open(LINKS, ">>$file") or die "&CLIENT_get_links_threads: Cannot open $file to add links: $!\n";
flock(LINKS,LOCK_EX);
foreach $link (@links) {
print LINKS "$current_depth $link\n";
}
close LINKS or warn "&CLIENT_get_links_threads: Cannot close $file: $!\n";
flock(LINKS,LOCK_UN);

# speicher freigeben
undef $obj_spider;
undef @links;
undef $html;
return 1;

} # sub CLIENT_get_links_threads {}

View full thread Speicherleaks bei Arbeiten mit Threads - Lösung?