perlunity.de - PERL | JAVASCRIPT | PHP | MySQL | APACHE



#!/COMMUNITY

Members: 5374
davon online: 1
weitere User: 18
Click for quality!




12.02.2012 / 00:16

Community-Member werden   |   Paßwort vergessen   |   OnlineMonitor (1) Wer ist online ... OnlineMonitor starten !
     

 

Home


PERLscripts


PHPscripts


JAVAscripts


Hilfreiches


Links2www


Newscenter


Community


Interna




Community  »  Perl: Allgemeines Forum zur Themenübersicht Themensuche Themenansicht in Thread-Modus


BeitragSpeicherzugriffsfehler
Seitenanfang
Hi,

Wie kann ich Speicherzugriffsfehler vermeiden/analysieren die in einem perlskript sporadisch auftreten (ca aller 10 - 15 ausführungen des skriptes).

Aufgabe des Skriptes ist 7 Threads zu starten diese rufen wiederum per "system(skriptname)" perlskripte auf die per LWP Webseiten auslesen und als Textdatei speichern.

schonmal danke im vorraus

mfg konz

Datum: 22.01.2007-13:30

Beitragre: Speicherzugriffsfehler
Seitenanfang
sry für den Doppelpost bloss ich brauch dringend hilfe mit dem Problem und hab bisher noch keine wirklich aktzeptable Lösung gefunden.

Vielleicht. kann mir auch einer erklären woraus die Speicherzugriffsfehler resultieren könnten.

mfg konz

Datum: 25.01.2007-14:05

Beitragre: Speicherzugriffsfehler
Seitenanfang
Ob sich das so in Perl ermitteln lässt, wage ich zu bezweifeln. Perl verwaltet den Speicher selbst, man hat da keinen Einfluss darauf.

Insofern würde ich vermuten, das die Speicherzugriffsfehler kommen, weil das Betriebssystem da was nicht kann, schliesslich gibst du den aufruf der anderen Skripte per System an das Betriebssystem. Ich glaube zumindest das es so funktioniert.

Ich würde vorschlagen du nutzt threads innerhalb von Perl, da kannst du entsprechend deinen Anforderungen die Aufgaben parallelisieren. Ob damit die Speicherfehler weggehen, weiß ich nicht.

Thredas auf'm CPAN:
http://search.cpan.org/~jdhedden/threads-1.57/threads.pm

Ich hoffe es hilft. :)

Grüße
Mario

Datum: 25.01.2007-14:28

Beitragre: Speicherzugriffsfehler
Seitenanfang
Danke für den Hinweis leider resultiert meiner meinung nach ja das Problem daraus das ich threads nutze und in diesen rufe ich per system() andere Skripte (mit variabler Anzahl) auf.

zur zeit sieht das ganze ungefähr so aus


my $max_parallel_jobs = 7; # Maximale Anzahl paralleler Jobs
my $total_jobs = 0; # Anzahl auszufuehrender Jobs
my $sem = Thread::Semaphore->new($max_parallel_jobs);
my @threads;

....

sub startThreads{

my @skripte;

@skripte = ( ['Skriptname1', 'Pfad zum Skript1'], ['Skriptname2', 'Pfad zum Skript2'], ..... );
$total_jobs = $#skripte;

while($#skripte >= 0){
(my $name, my $pfad) = @{shift(@skripte)};
$sem->down();
$threads[$#skripte + 1] = threads->create("exec_skript", $name, $pfad, $sem);

}

foreach my $thread (@threads) {
(my $name,my $pfad, my $err_code, my $err_msg) = eval{@{$thread->join}};
my $msg;
if ($err_code != 0) {
$msg = "$err_msg => $err_code";
$err_cnt++;
} else {
$msg = "Skript erfolgreich ausgefuehrt => $err_code";
}

DEBUG > 0 and print "\n=====================================\n";
DEBUG > 0 and print "Skript ausgefuehrt mit der TID ". $thread->tid() .": $name \n\t Pfad: $pfad \n\t Ausgefuehrt: $msg\n";
DEBUG > 0 and print "=====================================\n\n";
}
print Dumper(threads->list());
}

sub exec_skript{
my $name = shift;
my $pfad = shift;
my $sem = shift;

DEBUG > 1 and print "Gestartet: \tName: $name\t Pfad: $pfad\n";

system($pfad);

my @ret_vals = ($name, $pfad, $?, $!);

DEBUG > 1 and print "Beendet: \tName: $name\t Pfad: $pfad\t Rueckgabewert: $! => $?\n";
$sem->up();
return \@ret_vals;
}

Datum: 25.01.2007-16:07

-






-
-