2008-09-17 7 views
2

Ich habe ein Perl-Skript, das ich mit Perl-Threads (Threads verwenden) einrichten möchte. Wenn ich einfache Tests ausführen, funktioniert alles, aber wenn ich mein tatsächliches Skript (das die Threads mehrere SQL Plus-Sitzungen ausgeführt hat), wird jede SQL Plus-Sitzung in Reihenfolge ausgeführt (dh Thread 1 sqlplus führt die Schritte 1-5, dann thread 2 sqlplus führt die Schritte 6-11, etc.).Kann ich Perl-iThreads in Windows gleichzeitig ausführen lassen?

Ich dachte, ich verstehe, dass Threads gleichzeitige Verarbeitung tun würde, aber etwas ist nicht in Ordnung. Irgendwelche Ideen, oder sollte ich eine andere Perl-Magie machen?

+0

Ich, und würde andere erraten, sind neugierig, einige Folgen zu dieser Frage zu hören. Hast du eine Lösung gefunden? Waren die Antworten hier hilfreich? – Frosty

+0

Was Frosty sagte ... Was war das Problem? –

Antwort

4

Einige mögliche Erklärungen:

  1. Laufen Sie dieses Skript auf einem Multi-Core-Prozessor oder Multi-Prozessor-Maschine? Wenn Sie nur eine CPU haben, kann sie nur von einem Thread verwendet werden.

  2. Gibt es in den Schritten 1-6 Transaktionen oder Sperren, die verhindern, dass es gleichzeitig ausgeführt wird?

  3. Sind Sie sicher, dass Sie mehrere Verbindungen zur Datenbank verwenden und keine einzige Verbindung zwischen Threads teilen?

+0

Es gab nur eine DB-Verbindung, die ich nicht erwartet hatte. Danke für die Idee (dachte nie, das zu überprüfen), jetzt habe ich Arbeit zu tun ... – Milner

2

Eigentlich haben Sie keine Möglichkeit zu garantieren, in welcher Reihenfolge Threads ausgeführt werden. Also das Verhalten (wenn nicht was du erwartest) ist nicht wirklich falsch.

Ich vermute, Sie haben hier eine Art Synchronisation. Eventuell darf SQL * Plus nur einmal aufgerufen werden? Einige Programme tun ...

Andere possiblilties:

  • Threaderstellung und Prozesserstellung (Sie sind Erstellen von Teilprozessen für SQL * Plus, nicht wahr?) Länger dauern als der Faden , so wird Thread 1 beendet, bevor Thread 2 sogar startet

  • Sie verwenden Transaktionen in Ihren SQL-Skripts, die die Synchronisierung von Datenbankaktualisierungen erzwingen.

1

Überprüfen Sie Ihre Datenbankeinstellungen. Sie können feststellen, dass es auf eine konservative Weise eingerichtet ist. Das würde sogar geringfügige Lesevorgänge verursachen, um den Zugriff auf diese Informationen zu blockieren.

Möglicherweise müssen Sie auch threads::yield anrufen.