Threads oder asynch?

8

Wie machen Sie Ihre Anwendung Multithread? Verwenden Sie asynchrone Funktionen? oder spawnt du einen neuen Thread? Ich denke, dass Asynch-Funktionen bereits einen Thread hervorbringen. Wenn Ihr Job also nur ein wenig liest, faul ist und nur einen Job auf einem Thread erzeugt, würden die Ressourcen einfach "verschwendet" ... Gibt es also eine Art von Design bei der Verwendung von Thread- oder Asynch-Funktionen?

    
CiNN 14.09.2008, 13:56
quelle

5 Antworten

6

Laichen von Threads wird nur Ressourcen verschwenden, wenn Sie beginnen, Tonnen von ihnen zu erzeugen, ein oder zwei zusätzliche Threads werden nicht die Plattformproformance beeinflussen, infact System hat derzeit über 70 Threads für mich, und MSN verwendet 32 ​​( Ich habe wirklich keine Ahnung, wie ein Messenger diese vielen Threads verwenden kann, besonders wenn er minimiert ist und nicht wirklich etwas tut ...)

Normalerweise ist es ein guter Zeitpunkt, um einen Thread zu spawnen, wenn etwas lange dauern wird, aber Sie müssen etwas anderes machen.

Beispiel: Eine Berechnung dauert 30 Sekunden. Am besten erstellen Sie einen neuen Thread für die Berechnung, damit Sie den Bildschirm weiterhin aktualisieren und alle Benutzereingaben verarbeiten können, da die Benutzer sie hassen werden, wenn Ihre App bis zum Abschluss der Berechnung einfriert.

Andererseits ist es fast sinnlos, Threads zu erstellen, um etwas zu tun, was fast sofort erledigt werden kann, da der Overhead beim Erstellen (oder auch nur das Übergeben von Arbeit an einen vorhandenen Thread unter Verwendung eines Thread-Pools) höher ist als das Ausführen Job an erster Stelle.

Manchmal können Sie Ihre App in ein paar separate Teile zerlegen, die in ihren eigenen Threads laufen. Zum Beispiel in Spielen die Updates / Physik usw. kann ein Thread sein, während Grahpics sind andere, Sound / Musik ist ein Drittel, und Vernetzung ist eine andere. Das Problem hier ist, dass Sie wirklich darüber nachdenken müssen, wie diese Teile interagieren werden, sonst haben Sie möglicherweise schlechtere Proformanz, Bugs, die scheinbar "zufällig" passieren, oder es kann sogar zu Deadlocks kommen.

    
Fire Lancer 14.09.2008, 14:06
quelle
7

Wenn Sie über .Net sprechen, vergessen Sie nicht den ThreadPool . Der Thread-Pool ist auch, was Asynch-Funktionen oft verwenden. Wenn Sie zu viele Threads erstellen, kann das Ihre Leistung beeinträchtigen. Ein Thread-Pool soll nur so viele Threads erzeugen, dass die Arbeit am schnellsten erledigt werden kann. Verwenden Sie also einen Thread-Pool, anstatt eigene Threads zu erstellen, es sei denn, der Thread-Pool erfüllt Ihre Anforderungen nicht.

PS: Und behaltet die im Auge Parallele Erweiterungen von Microsoft

    
Lars Truijens 14.09.2008 14:02
quelle
2

Ich werde die Antwort von Fire Lancer beantworten - das Erstellen eigener Threads ist ein ausgezeichneter Weg große Aufgaben zu bearbeiten oder eine Aufgabe zu bearbeiten, die ansonsten für den Rest der synchronen App "blockiert" würde, aber muss ein klares Verständnis des Problems haben, das Sie auf eine Art und Weise lösen und entwickeln müssen definiert klar die Aufgabe eines Threads und begrenzt den Umfang dessen, was er tut.

Für ein Beispiel, an dem ich kürzlich gearbeitet habe: Eine Java-Konsolen-App wird regelmäßig ausgeführt, um Daten durch Screen-Scraping von URLs zu erfassen, das Dokument mit DOM zu analysieren, Daten zu extrahieren und in einer Datenbank zu speichern.

Als Single-Thread-Anwendung wurde, wie zu erwarten, ein Alter von durchschnittlich 1 URL pro Sekunde für eine 50-KByte-Seite verwendet. Nicht schlecht, aber wenn Sie Tausende von URLs in einem Batch verarbeiten müssen, ist das nicht gut.

Profiling der App zeigte, dass die meiste Zeit der aktive Thread im Leerlauf war - es wartete auf E / A-Operationen - Öffnen eines Sockets auf die Remote-URL, Öffnen einer Verbindung zur Datenbank usw. Es ist diese Art von Situation, die kann mit Multithreading leicht verbessert werden. Das Umschreiben auf Multi-Threading und mit nur 5 Threads anstelle von einem, sogar auf einer Single-Core-CPU, ergab eine Durchsatzsteigerung von über 20 Mal.

In diesem Beispiel wurde jeder "worker" -Thread explizit auf das beschränkt, was er getan hat - öffne die remote eine entfernte URL, analysiere die Daten, speichere sie in der db. Alle "High-Level" -Verarbeitung - Generieren der Liste von URLs zum Parsen, Ausarbeiten der nächsten, Umgang mit Fehlern, alle blieben mit der Kontrolle des Haupt-Thread.

    
Ian 14.09.2008 14:55
quelle
0

Die Verwendung von Threads lässt Sie mehr darüber nachdenken, wie Ihre Anwendung ein Threading durchführen muss und auf lange Sicht die Verbesserung / Kontrolle Ihrer Leistung erleichtern kann.
Asynchrone Methoden sind schneller zu benutzen, aber sie sind ein bisschen magisch - eine Menge Dinge passieren, um sie möglich zu machen - also ist es wahrscheinlich, dass du irgendwann etwas brauchst, das sie dir nicht geben können. Dann können Sie versuchen, einige benutzerdefinierte Threading-Code zu rollen Es hängt alles von Ihren Bedürfnissen ab.

    
kokos 14.09.2008 14:05
quelle
0

Die Antwort ist "es kommt darauf an".

Es hängt davon ab, was Sie erreichen wollen. Ich gehe davon aus, dass Sie mehr Leistung anstreben.

Die einfachste Lösung besteht darin, einen anderen Weg zu finden, um Ihre Leistung zu verbessern. Führen Sie einen Profiler aus. Suchen Sie nach Hotspots. Reduziere unnötige IO.

Die nächste Lösung besteht darin, Ihr Programm in mehrere Prozesse aufzuteilen, von denen jeder in seinem eigenen Adressraum ausgeführt werden kann. Dies ist am einfachsten, da die einzelnen Prozesse keine Chance haben, sich gegenseitig zu vermasseln.

Die nächste Lösung besteht darin, Threads zu verwenden. An diesem Punkt öffnest du eine große Dose Würmer, also fange klein an und fädle nur den kritischen Pfad des Codes ein.

Die nächste Lösung besteht darin, asynch IO zu verwenden. Im Allgemeinen nur für Leute empfohlen, die einen sehr stark ausgelasteten Server schreiben, und selbst dann würde ich lieber eines der bestehenden Frameworks wiederverwenden, die die Details z. das C ++ - Framework ICE oder ein EJB-Server unter Java.

Beachten Sie, dass jede dieser Lösungen mehrere Unterlösungen hat - es gibt verschiedene Arten von Threads und verschiedene Arten von asynch IO mit jeweils leicht unterschiedlichen Leistungsmerkmalen, aber es ist im Allgemeinen auch am besten, wenn das Framework das für Sie übernimmt.

    
Noel Grandin 16.09.2008 12:04
quelle