Wieviele Threads gleichzeitig laufen lassen?
Wieviele Threads gleichzeitig laufen lassen?
Ich habe mal eine Grundsatzfrage zur Verwendung von Threads. Ich habe mehrere Textdateien die ich einlese und auswerte. Momentan mache ich das ohne Threads, d.h. ich arbeite die Liste der Textdateien der Reihe nach ab.
Bin nun am überlegen, ob ich die verschiedenen Textdateien in verschiedenen Threads abarbeiten soll. Wenn die Maschine nun z.B. nur einen Kern hätte (gibt es ja kaum noch), wäre es sicher Kontraproduktiv, mehrere Threads zu starten. Wahrscheinlich ist es genau so Kontraproduktiv, mehr Threads zu starten, als Kerne im Prozessor sind.
Wie würdet ihr das handhaben? Ein Haupt-Thread, der nur die Verwaltung macht und je vorhandenen Kern (-1 für den Hauptthread) einen Thread zur Auswertung einer Textdatei startet und wenn eine Textdatei fertig bearbeitet ist, wieder einen Thread mit einer neuen Textdatei starten.
Habt Ihr so was schon mal gemacht, oder soll ich einfach brutal für jede Textdatei einen Thread starten, ohne Rücksicht auf die Anzahl der Kerne zu nehmen?
Bin nun am überlegen, ob ich die verschiedenen Textdateien in verschiedenen Threads abarbeiten soll. Wenn die Maschine nun z.B. nur einen Kern hätte (gibt es ja kaum noch), wäre es sicher Kontraproduktiv, mehrere Threads zu starten. Wahrscheinlich ist es genau so Kontraproduktiv, mehr Threads zu starten, als Kerne im Prozessor sind.
Wie würdet ihr das handhaben? Ein Haupt-Thread, der nur die Verwaltung macht und je vorhandenen Kern (-1 für den Hauptthread) einen Thread zur Auswertung einer Textdatei startet und wenn eine Textdatei fertig bearbeitet ist, wieder einen Thread mit einer neuen Textdatei starten.
Habt Ihr so was schon mal gemacht, oder soll ich einfach brutal für jede Textdatei einen Thread starten, ohne Rücksicht auf die Anzahl der Kerne zu nehmen?
- juergenkulow
- Beiträge: 188
- Registriert: 22.12.2016 12:49
- Wohnort: :D_üsseldorf-Wersten
Re: Wieviele Threads gleichzeitig laufen lassen?
Hallo Josh,
wie lange braucht Dein Programm beim ersten mal um die Textdateien von der Festplatte einzulesen und wie lange braucht Dein Programm für die Auswertung?
Eine Textdatei teilweise von der Festplatte zu lesen, den Lesekopf auf eine andere Textdatei zu setzen und dann die erste Textdatei weiter zu lesen ist sicher nicht optimal.
Der Start eines Threads braucht bei mir etwa 25 Mikrosekunden und 1 MB Speicher für Threadstack.
Gruß
wie lange braucht Dein Programm beim ersten mal um die Textdateien von der Festplatte einzulesen und wie lange braucht Dein Programm für die Auswertung?
Eine Textdatei teilweise von der Festplatte zu lesen, den Lesekopf auf eine andere Textdatei zu setzen und dann die erste Textdatei weiter zu lesen ist sicher nicht optimal.
Der Start eines Threads braucht bei mir etwa 25 Mikrosekunden und 1 MB Speicher für Threadstack.
Gruß
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Wieviele Threads gleichzeitig laufen lassen?
Dateioperationen in Threads auszulagern ist meistens kontraproduktiv, wobei SSDs daran schon einiges geändert haben.
Erzähl uns mal etwas mehr über dein Vorhaben und vor allem die Größe und Anzahl der Daten, damit man abschätzen kann welches Vorgehen sich am ehesten lohnt.
Erzähl uns mal etwas mehr über dein Vorhaben und vor allem die Größe und Anzahl der Daten, damit man abschätzen kann welches Vorgehen sich am ehesten lohnt.
Re: Wieviele Threads gleichzeitig laufen lassen?
Das mit den Kernen ist richtig. Es können max. soviele parallel Threads laufen, wie der Prozessor Kerne hat. Jeder weitere bringt keinen Vorteil (eher Nachteile).
Mehr Threads als Kerne macht keinen Sinn. Wenn du 5 Threads, aber nur 2 Kerne hast, laufen trotzdem nur max. 2 gleichzeitig. Nicht umsonst kann man bei rechenlastigen Dingen (wie z.B. Videokompression) die Anzahl Threads vorgeben.
Wenn du 100 Dateien in eigenen Threads öffnest, hättest du 100 Threads, die sich um die vorhandenen Kerne (und vor allem, und wie auch schon angesprochen, um die Festplatte) Kloppen. Dann passiert in etwa das, was auch passiert, wenn du im Dateimanager 100 Dateien markierst und auf Enter drückst.
Ich würde mal in den Raum werfen: Einen Thread für dein Hauptprogramm/GUI (den Mainthread, den du sowieso hast) und noch einen weiteren, der die Dateien nacheinander von der Festplatte einliest und verarbeitet. Der Mainthread sagt dann: "Lesethread, lade Datei xyz und gib mir das Ergebnis zurück, sobald du fertig bist.".
Auch wenn das jetzt auf einem Prozessor mit nur einem Kern läuft, ist es trotzem besser, weil sie dann wie beim normalen Multitasking abwechselnd ausgeführt werden und das Hauptprogramm vom User währenddessen weitergenutzt werden kann.
Die größte Bremse wird ohnehin die Festplatte sein und die ist am schnellsten, wenn nur ein Prozess darauf zugreift.
Besser nicht.oder soll ich einfach brutal für jede Textdatei einen Thread starten, ohne Rücksicht auf die Anzahl der Kerne zu nehmen?
Mehr Threads als Kerne macht keinen Sinn. Wenn du 5 Threads, aber nur 2 Kerne hast, laufen trotzdem nur max. 2 gleichzeitig. Nicht umsonst kann man bei rechenlastigen Dingen (wie z.B. Videokompression) die Anzahl Threads vorgeben.
Wenn du 100 Dateien in eigenen Threads öffnest, hättest du 100 Threads, die sich um die vorhandenen Kerne (und vor allem, und wie auch schon angesprochen, um die Festplatte) Kloppen. Dann passiert in etwa das, was auch passiert, wenn du im Dateimanager 100 Dateien markierst und auf Enter drückst.
Ich würde mal in den Raum werfen: Einen Thread für dein Hauptprogramm/GUI (den Mainthread, den du sowieso hast) und noch einen weiteren, der die Dateien nacheinander von der Festplatte einliest und verarbeitet. Der Mainthread sagt dann: "Lesethread, lade Datei xyz und gib mir das Ergebnis zurück, sobald du fertig bist.".
Auch wenn das jetzt auf einem Prozessor mit nur einem Kern läuft, ist es trotzem besser, weil sie dann wie beim normalen Multitasking abwechselnd ausgeführt werden und das Hauptprogramm vom User währenddessen weitergenutzt werden kann.
Die größte Bremse wird ohnehin die Festplatte sein und die ist am schnellsten, wenn nur ein Prozess darauf zugreift.
Re: Wieviele Threads gleichzeitig laufen lassen?
Einfach mal ausprobieren.
Ich weiß noch wie wird damals über robocopys multithreading option gestaunt haben.
Rechner hatten nur 1 CPU Kern (+HT), aber mit 16 Threads wurde deutlich schneller kopiert.
Gibt halt viele Variablen die da mit reinspielen.
Der Dateisystemtreiber ist auch nicht blöd und springt nicht unnötig auf der Festplatte rum.
Ich weiß noch wie wird damals über robocopys multithreading option gestaunt haben.
Rechner hatten nur 1 CPU Kern (+HT), aber mit 16 Threads wurde deutlich schneller kopiert.
Gibt halt viele Variablen die da mit reinspielen.
Der Dateisystemtreiber ist auch nicht blöd und springt nicht unnötig auf der Festplatte rum.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Re: Wieviele Threads gleichzeitig laufen lassen?
So viele wie man eben braucht.Wieviele Threads gleichzeitig laufen lassen?
Man könnte ja auch das Maximum austesten und sehen was der Stack hergibt.
Im "Normalfall" braucht man aber recht wenig Threads.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Wieviele Threads gleichzeitig laufen lassen?
Ist kein Problem mit vielen Threads, wenn man viele nennen bei einer meiner Anwendungen darf...
Beispiel:
Pro Kommunikation zu einer Steuer werden immer zwei Threads benötigt. Einen für die Kommunikation und einen als Watchdog.
Zur zeit sind 60 Steuerung eingerichtet und Somit 120 Thread aktiv.
Dazu kommt ein Threads zur bearbeiten der gesammelten Daten und übergibt diese eine Datenbank.
Läuft absolute Störungsfrei und die Belastung der CPU ist sehr Minimal. Unter 1 Prozent bei inaktiver GUI.
Beispiel:
Pro Kommunikation zu einer Steuer werden immer zwei Threads benötigt. Einen für die Kommunikation und einen als Watchdog.
Zur zeit sind 60 Steuerung eingerichtet und Somit 120 Thread aktiv.
Dazu kommt ein Threads zur bearbeiten der gesammelten Daten und übergibt diese eine Datenbank.
Läuft absolute Störungsfrei und die Belastung der CPU ist sehr Minimal. Unter 1 Prozent bei inaktiver GUI.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
- Sylvia
- verheiratet<br>1. PureGolf-Gewinner
- Beiträge: 487
- Registriert: 29.08.2004 09:42
- Wohnort: Old Europe
Re: Wieviele Threads gleichzeitig laufen lassen?
Wenn du mal in der Systemsteuerung (bei Windows) unter Leistung nachsiehst, wirst du immer sehen, dass zwischen 1000-2000 Threads am laufen sind. Die Anzahl der Threads ist also grundsätzlich in bestimmen Grenzen "egal" und nicht abhängig von der Anzahl Kerne. Entscheidend ist, was in den Threads gemacht wird.
Wenn in einem Thread auf das Eintreten eines bestimmten System-Ereignisses gewartet wird (wie z.B.die Positionierung des Schreib/lese-Kopfes der Festplatte ), wird DIESER Kern des Prozessors für die nachstehenden Threads ausgebremst.
Wenn in einem Thread auf das Eintreten eines bestimmten System-Ereignisses gewartet wird (wie z.B.die Positionierung des Schreib/lese-Kopfes der Festplatte ), wird DIESER Kern des Prozessors für die nachstehenden Threads ausgebremst.
Basic Pur = PureBasic
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: Wieviele Threads gleichzeitig laufen lassen?
Ja! Es ist die Aufgabe des Betriebssystems, diese geschickt zu verteilen und braucht uns nicht zu kümmern! Denn einzigen Einfluss darauf haben wir, in dem wir mehrere Threads erzeugen, die dann das OS aufteilen kann.ohne Rücksicht auf die Anzahl der Kerne zu nehmen?
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Re: Wieviele Threads gleichzeitig laufen lassen?
Kurze Frage: Wo genau ist das zu sehen (unter Windows 7)? Ich finde es leider nicht.Sylvia hat geschrieben:Wenn du mal in der Systemsteuerung (bei Windows) unter Leistung nachsiehst, wirst du immer sehen, dass zwischen 1000-2000 Threads am laufen sind.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.