Zum Inhalt springen

[Perl] Thread Problem


Empfohlene Beiträge

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 von Huwy
Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von uenetz
Link zu diesem Kommentar
Auf anderen Seiten teilen

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].

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 2 Monate später...

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...