2009-03-31 7 views
0

ich ein Programm habe ich die Erstellung (in C#) und ich sehe zwei Ansätze ..erstellen, neue Themen oder bekommen mehr Arbeit für Themen

1) Ein Job-Manager, der für eine beliebige Anzahl von X-Threads wartet bis zum Ende, wenn sie fertig sind es das nächste Stück Arbeit bekommt und erstellt einen neuen Thread und gibt es, dass die Brocken

oder

2) Wir X Threads erstellen sie jedem ein Stück Arbeit zu beginnen, geben, und wenn Ein Thread beendet einen Chunk und fragt den Jobmanager nach mehr Arbeit. Wenn es keine Arbeit mehr gibt, schläft es und fragt dann erneut, wobei der Schlaf immer länger wird.

Dieses Programm wird ein Lauf und fertig, so könnte ich sehen, dass es in einen Dienst verwandelt, der ständig nach mehr Jobs sucht.

Jeder Chunk besteht aus einer Reihe von Daten-IDs, einem Aufruf an die Datenbank, um einige Informationen zu erhalten oder eine Operation für die Daten-ID auszuführen, und dann Schreiben in die Datenbank-Information über die Daten-ID.

+0

um Ansatz 1 zu klären, es wartet auf einen Thread zu beenden, und erstellt dann einen neuen Thread und gibt diesem Thread mehr Arbeit, wenn es mehr Arbeit zu tun ist –

+0

Gegeben, dass mit dem zweiten Ansatz gehen. Lassen Sie den Thread jedoch statt eines Schlaf-Check-Schlaf-Verfahrens nach einem Arbeitselement am Ende fragen. Wenn es keinen gibt, muss es unbegrenzt schlafen. Dann suchen Sie in Ihrem Koordinator schlafende Fäden und signalisieren einem von ihnen, aufzuwachen. –

Antwort

2

Vorausgesetzt, Sie sind sich der zusätzlichen Vorsichtsmaßnahmen bewusst, die bei Multithread-Datenbankoperationen zu beachten sind, klingt es, als würden Sie zwei verschiedene Szenarien beschreiben. Im ersten Fall laufen mehrere Threads, und sobald ALLE fertig sind, wird nach neuen Arbeiten gesucht. In der zweiten haben Sie mehrere Threads ausgeführt und ihre Operationen sind vollständig parallel. Ihre Umgebung bestimmt den richtigen Ansatz. Wenn es etwas gibt, das all die Arbeit in den verschiedenen Threads bindet, wo zusätzliche Arbeit nicht fortgesetzt werden kann, bis alle fertig sind, dann mit dem ersteren. Wenn sie sich nicht sehr beeinflussen, gehen Sie mit letzterem.

-1

Anstatt eine eigene Lösung zu erstellen, sollten Sie sich die Klasse ThreadPool im .NET-Framework ansehen. Sie könnten die QueueUserWorkItem Methode verwenden. Es sollte genau das tun, was Sie erreichen wollen.

+0

@EFrank: Wenn die Arbeit lange läuft, dann wäre das keine gute Idee. – casperOne

+0

@EFrank (+1 zu casperOne): Die ThreadPool-Klasse verwendet Systemthreads und ist für Operationen mit einem kurzen Lebenszyklus (und relativ seltener Verwendung) ausgelegt. Wenn Sie anspruchsvoller sind, sollten Sie eigene Threads erstellen. –

1

Die zweite Option ist nicht wirklich richtig, da die Schlafzeit immer länger wird bedeutet, dass Sie diese Threads unnötigerweise blockieren.

Stattdessen sollten Sie eine gepoolte Gruppe von Threads wie die zweite Option haben, aber sie verwenden WaitHandles, um auf Arbeit zu warten und ein Producer/Consumer-Muster zu verwenden. Wenn der Produzent anzeigt, dass es Arbeit gibt, sendet er ein Signal an einen Verbraucher (es wird einen Manager geben, der bestimmt, welcher Thread die Arbeit erhält und dann diesen Thread signalisiert), der aufwacht und zu arbeiten beginnt.

Möglicherweise möchten Sie in der Parallel Task Library nachsehen. Es ist jetzt in der Betaversion, aber wenn Sie es benutzen können und es sich gut anfühlen, würde ich es empfehlen, da es Ihnen eine Menge davon (und viel besser, unter Berücksichtigung der Anzahl der Kerne auf einer Maschine, der optimale Anzahl von Threads, etc, etc).

+0

Das Problem mit PTL ist, dass es die CPU maximiert, und wir sind mehr DB gebunden, so müssen wir die Anzahl von thr genauer verwalten. Das P/C-Muster ist die Option 1, außer dass ein neuer Thr erstellt wird, nachdem ein Thread fertig ist, der Thr geht in den Ruhezustand und das p sucht nach einem wartenden thr und sendet es mehr Arbeit? –

1

Die frühere Lösung (spawn einen Thread für jede neue Arbeit), ist einfacher zu programmieren, und nicht so schlecht, wenn die Arbeitseinheiten groß genug sind.

Die zweite Lösung (Thread-Pool, mit einer Warteschlange der Arbeit), ist komplizierter zu codieren, unterstützt aber kleinere Arbeitseinheiten.