Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7172[/thread]

Speicherleaks bei Arbeiten mit Threads - Lösung?



<< >> 5 Einträge, 1 Seite
Gast Gast
 2005-07-29 20:01
#56820 #56820
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

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
} elsif ($follow_flag == "1"){


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; } && 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; } && warn $@ if $@; };



}



# ...

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

# ...

} else {
\n\n

<!--EDIT|esskar|1122653033-->
esskar
 2005-07-29 20:06
#56821 #56821
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm; was macht CLIENT_get_links_threads ?
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 {}
[E|B]
 2005-07-29 22:07
#56823 #56823
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Bitte das nächste Mal kein neues Thema öffnen.
Threads wurden miteinander verschmolzen.
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2005-07-29 23:47
#56824 #56824
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm; das flock nach dem close ist unnötig;
lass es weg; das close macht das schon für dich;
aber das führt wohl nicht zum lock.

gibts nen grund für das eval um das join ?
<< >> 5 Einträge, 1 Seite



View all threads created 2005-07-29 20:01.