Huwy Geschrieben 28. Juni 2013 Teilen Geschrieben 28. Juni 2013 (bearbeitet) Hallo zusammen, sorry für meinen wenig-sagenden Titel, aber ich wusste nicht wie ich das Problem mit einem Titel zusammenfassen soll Folgendes Problem: Ich habe ein Perl vor mir, welches Daten einer zentralen Datenbank mit knapp 1000 dezentralen Datenbanken abgleicht. Damit die 1000 Datenbankconnects etwas parallel laufen, wurde in dem Perl mit Threads gearbeitet - diese jedoch auf 200 beschränkt. Da das Perl mit 200 Threads gar nicht mehr läuft bin ich auf 20 runter und hab mir ein kleines Log-File eingebaut. Im Folgenden der betroffene Code-Abschnitt: while (my @row=$sth_databasesettings->fetchrow_array){ &checkThreads(); my $t = threads -> new (\&daten, $row[0], $row[1], $row[2], $row[3], $row[4]); push(@threads, $t); } Die Sub &daten ruft dann jeweils die zu vergleichenen Daten von der externen Datenbank ab. Hier noch die sub &checkThreads: sub checkThreads{ my $addThread = 0; until($addThread){ my $totalThreads = 0; foreach my $task (@threads){ if($task->is_running()){$totalThreads++;} } if($totalThreads <= 20){ $addThread = 1; }else{ sleep 2; } } } Hier werden einfach die aktuell laufenden Threads durchgezählt und falls die Zahl unter 20 liegt, kann ein neuer erstellt werden. Wenn schon 20 laufen, wird für 2 Sekunden pausiert. Und jetz zu meinem Problem: Use of uninitialized value $threads[188] in join or string at checker_test .pl line 182. Can't call method "is_running" on an undefined value at checker_test.pl li ne 429. Perl exited with active threads: 19 running and unjoined 169 finished and unjoined Bei 188 Threads (19 running) klappt die Erstellung des Threads anscheinend nicht mehr. Weiß jemand, ob irgendwelche Beschränkungen nicht eingehalten werden, die mir gerade nicht auffallen? Ich muss dazu sagen, dass das Programm erstens nicht von mir stammt und ich mich heute das erste Mal mit diesem Fehler auseinander setze und dass das Programm zweitens schon mal gelaufen ist auf unseren alten Systemen - zwischendurch haben wir jedoch unsere Serverlandschaft umgezogen (allerdings auch auf bessere Hardware). Mein Log-File zeigt mir, dass alles eigentlich genau so läuft wie geplant, bis zu dem Punkt an dem der Fehler auftritt. Gruß Tom PS: Ist natürlich auch die Frage, ob ich hier richtig aufgehoben bin. Denn ich vermute eher ein Problem auf den dezentralen Datenbanken bzw. dem Server, auf dem das Skript läuft. Bearbeitet 28. Juni 2013 von Huwy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
uenetz Geschrieben 28. Juni 2013 Teilen Geschrieben 28. Juni 2013 (bearbeitet) Can't call method "is_running" on an undefined value at checker_test.pl li ne 429. Da fehlt das Objekt $task?. Oops, in den Beispielen, die ich angesehen habe, ist is_running keine Methode/Funktion, sondern eine Variable. Bearbeitet 28. Juni 2013 von uenetz Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Huwy Geschrieben 3. Juli 2013 Autor Teilen Geschrieben 3. Juli 2013 Can't call method "is_running" on an undefined value at checker_test.pl li ne 429. Da fehlt das Objekt $task?. Oops, in den Beispielen, die ich angesehen habe, ist is_running keine Methode/Funktion, sondern eine Variable. Jop! Das Problem an sich ist mir bewusst. Zu dem Zeitpunkt steht in $task kein Wert mehr. Aber ich versuche eher rauszufinden, warum da nichts mehr drin steht bzw. wo irgendein Speicher vollläuft. Wie man weiter oben sieht, besteht das Problem erst bei $threads[188]. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Huwy Geschrieben 3. September 2013 Autor Teilen Geschrieben 3. September 2013 Falls es noch jemand interessiert. Ist zwar keine Lösung, aber anscheinend arbeiten Threads in Perl ziemlich unzuverlässig. Ich habe nun eines durch einen internen Entwickler implementiertes Modul zur Hand genommen und lass das Perl damit laufen. Dies arbeitet irgendwie mit DOS-Boxen als "Threads" und das funktioniert ohne Probleme und zuverlässig. Was jetzt genau das Problem mit dem Modul threads ist, kann ich leider nicht sagen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.