Wie viele Threads sind zu viele?

312

Ich schreibe einen Server und sende jede Aktion von in einen separaten Thread, wenn die Anfrage empfangen wird. Ich mache das, weil fast jede Anfrage eine Datenbankabfrage macht. Ich verwende eine Threadpool-Bibliothek, um die Konstruktion / Zerstörung von Threads zu reduzieren.

Meine Frage ist: Was ist ein guter Grenzwert für solche E / A-Threads? Ich weiß, es wäre nur eine grobe Schätzung, aber sprechen wir über Hunderte? Tausende?

Wie würde ich herausfinden, wie hoch dieser Grenzwert sein würde?


BEARBEITEN:

Vielen Dank für Ihre Antworten. Es scheint, als müsste ich es nur testen, um meine Obergrenze für die Fadenzahl herauszufinden. Die Frage ist jedoch: Woher weiß ich, dass ich diese Decke erreicht habe? Was genau soll ich messen?

Ryeguy
quelle
1
@ryeguy: Der ganze Punkt hier ist, dass Sie kein Maximum im Threadpool festlegen sollten, wenn es zunächst keine Leistungsprobleme gibt. Die meisten Ratschläge, einen Threadpool auf ~ 100 Threads zu beschränken, sind lächerlich. Die meisten Threadpools haben / way / more Threads und haben nie ein Problem.
GEOCHET
Ryeguy, siehe Ergänzung zu meiner Antwort unten, was zu messen ist.
paxdiablo
Vergessen Sie nicht, dass Python von Natur aus nicht wirklich Multithread-freundlich ist. Zu jedem Zeitpunkt wird ein einzelner Bytecode-Opcode ausgeführt. Dies liegt daran, dass Python Global Interpreter Lock verwendet.
Fragen Sie
1
@ Jay D: Ich würde sagen, der Moment, in dem Sie die Decke erreicht haben, ist, wenn Ihre Leistung zu sinken beginnt.
Ninjalj
6
@GEOCHET "Der ganze Punkt hier ist, dass Sie kein Maximum im Threadpool einstellen sollten" Ähm ... sagen Sie was? Thread-Pools mit fester Größe bieten die Vorteile einer ordnungsgemäßen Verschlechterung und Skalierbarkeit. Wenn Sie beispielsweise in einer Netzwerkeinstellung neue Threads basierend auf Clientverbindungen erzeugen, besteht ohne feste Poolgröße die sehr reale Gefahr, (auf die harte Tour ) zu erfahren, wie viele Threads Ihr Server verarbeiten kann, und jeden einzelnen verbundenen Client wird leiden. Ein Pool mit fester Größe wirkt wie ein Rohrventil, indem er Ihren Server daran hindert, mehr abzubeißen, als er kauen kann.
b1nary.atr0phy

Antworten:

206

Einige Leute würden sagen, dass zwei Threads zu viele sind - ich bin nicht ganz in diesem Lager :-)

Hier ist mein Rat: Messen, nicht raten. Ein Vorschlag ist, es konfigurierbar zu machen und es zunächst auf 100 zu setzen, dann Ihre Software für die Wildnis freizugeben und zu überwachen, was passiert.

Wenn Ihre Thread-Nutzung bei 3 liegt, ist 100 zu viel. Wenn es den größten Teil des Tages bei 100 bleibt, erhöhen Sie es auf 200 und sehen Sie, was passiert.

Sie könnten Ihren Code selbst die Nutzung überwachen lassen und die Konfiguration für den nächsten Start anpassen, aber das ist wahrscheinlich übertrieben.


Zur Klarstellung und Ausarbeitung:

Ich befürworte nicht, Ihr eigenes Thread-Pooling-Subsystem zu rollen. Verwenden Sie auf jeden Fall das, das Sie haben. Da Sie jedoch nach einem guten Grenzwert für Threads gefragt haben, gehe ich davon aus, dass Ihre Thread-Pool-Implementierung die maximale Anzahl erstellter Threads begrenzen kann (was eine gute Sache ist).

Ich habe Pooling-Code für Thread- und Datenbankverbindungen geschrieben und sie haben die folgenden Funktionen (von denen ich glaube, dass sie für die Leistung wesentlich sind):

  • eine minimale Anzahl von aktiven Threads.
  • eine maximale Anzahl von Threads.
  • Herunterfahren von Threads, die seit einiger Zeit nicht mehr verwendet wurden.

Der erste legt eine Basislinie für die Mindestleistung in Bezug auf den Thread-Pool-Client fest (diese Anzahl von Threads steht immer zur Verwendung zur Verfügung). Mit der zweiten Option wird die Ressourcennutzung durch aktive Threads eingeschränkt. Mit dem dritten Schritt kehren Sie in ruhigen Zeiten zur Grundlinie zurück, um den Ressourcenverbrauch zu minimieren.

Sie müssen die Ressourcennutzung durch nicht verwendete Threads (A) gegen die Ressourcennutzung durch nicht genügend Threads für die Arbeit (B) abwägen.

(A) ist im Allgemeinen die Speichernutzung (Stapel usw.), da ein Thread, der keine Arbeit erledigt, nicht viel von der CPU verbraucht. (B) ist im Allgemeinen eine Verzögerung bei der Verarbeitung von Anfragen, sobald diese eintreffen, da Sie warten müssen, bis ein Thread verfügbar ist.

Deshalb messen Sie. Wie Sie angeben, wartet die überwiegende Mehrheit Ihrer Threads auf eine Antwort aus der Datenbank, damit sie nicht ausgeführt werden. Es gibt zwei Faktoren, die sich darauf auswirken, wie viele Threads Sie zulassen sollten.

Die erste ist die Anzahl der verfügbaren DB-Verbindungen. Dies kann eine harte Grenze sein, es sei denn, Sie können sie am DBMS erhöhen. Ich gehe davon aus, dass Ihr DBMS in diesem Fall eine unbegrenzte Anzahl von Verbindungen aufnehmen kann (obwohl Sie dies idealerweise auch messen sollten).

Dann hängt die Anzahl der Threads, die Sie haben sollten, von Ihrer historischen Verwendung ab. Das Minimum, das Sie ausführen sollten, ist die Mindestanzahl, die Sie jemals ausgeführt haben, + A%, mit einem absoluten Minimum von (zum Beispiel und konfigurierbar wie A) 5.

Die maximale Anzahl von Threads sollte Ihr historisches Maximum + B% sein.

Sie sollten auch auf Verhaltensänderungen überwachen. Wenn Ihre Nutzung aus irgendeinem Grund für einen längeren Zeitraum zu 100% verfügbar ist (so dass dies die Leistung der Clients beeinträchtigt), sollten Sie das zulässige Maximum erhöhen, bis es wieder um B% höher ist.


Als Antwort auf die Frage "Was genau soll ich messen?" Frage:

Was Sie speziell messen sollten, ist die maximale Anzahl von Threads, die gleichzeitig geladen werden (z. B. auf eine Rückkehr vom DB-Aufruf warten). Dann fügen Sie einen Sicherheitsfaktor von 10% für Beispiel (hervorgehoben, da andere Plakate scheinen meine Beispiele als feste Empfehlungen zu nehmen).

Darüber hinaus sollte dies in der Produktionsumgebung zum Optimieren erfolgen. Es ist in Ordnung, vorher einen Kostenvoranschlag zu erhalten, aber Sie wissen nie, welche Produktion Ihren Weg finden wird (weshalb all diese Dinge zur Laufzeit konfigurierbar sein sollten). Dies dient dazu, eine Situation wie eine unerwartete Verdoppelung der eingehenden Clientanrufe zu erfassen.

paxdiablo
quelle
Wenn bei eingehenden Anforderungen Threads erzeugt werden, spiegelt die Thread-Verwendung die Anzahl der nicht bedienten Anforderungen wider. Daraus lässt sich die "optimale" Zahl nicht ermitteln. In der Tat werden Sie feststellen, dass mehr Threads mehr Ressourcenkonflikte verursachen und somit die Anzahl der aktiven Threads zunimmt.
Andrew Grant
@ Andrew, die Thread-Erstellung braucht Zeit, und Sie können die optimale Anzahl basierend auf historischen Daten [+ N%] bestimmen (daher messen, nicht raten). Darüber hinaus verursachen mehr Threads nur dann Ressourcenkonflikte, wenn sie arbeiten, und warten nicht auf ein Signal / Semaphor.
Paxdiablo
Wo verursachen diese Daten zur 'Thread-Erstellung' ein Leistungsproblem bei Verwendung eines Thread-Pools? Ein guter Thread-Pool würde keine Threads zwischen Aufgaben erstellen und zerstören.
GEOCHET
@Pax Wenn alle Ihre Threads auf dieselben Semaphoren warten, um DB-Abfragen auszuführen, ist dies genau die Definition von Konflikt. Es ist auch nicht wahr zu sagen, dass Threads nichts kosten, wenn sie auf ein Semaphor warten.
Andrew Grant
1
@ Andrew, ich kann nicht verstehen, warum Sie die DB-Abfragen semaphorisch blockieren würden. Jede anständige DB ermöglicht den gleichzeitigen Zugriff, wobei viele Threads auf die Antworten warten. Und Threads sollten keine Ausführungszeit kosten, während das Semaphor blockiert ist. Sie sollten in der blockierten Warteschlange stehen, bis das Semaphor freigegeben wird.
Paxdiablo
36

Diese Frage wurde ziemlich gründlich besprochen und ich hatte nicht die Gelegenheit, alle Antworten zu lesen. Bei der Betrachtung der Obergrenze für die Anzahl gleichzeitiger Threads, die in einem bestimmten System friedlich nebeneinander existieren können, sind jedoch einige Dinge zu beachten.

  1. Thread-Stapelgröße: Unter Linux beträgt die Standard-Thread-Stapelgröße 8 MB (Sie können ulimit -a verwenden, um dies herauszufinden).
  2. Maximaler virtueller Speicher, den eine bestimmte Betriebssystemvariante unterstützt. Linux Kernel 2.4 unterstützt einen Speicheradressraum von 2 GB. mit Kernel 2.6 bin ich etwas größer (3GB)
  3. [1] zeigt die Berechnungen für die maximale Anzahl von Threads pro gegebener maximal unterstützter VM. Für 2.4 sind es ungefähr 255 Threads. für 2.6 ist die Zahl etwas größer.
  4. Welchen Kindda-Kernel-Scheduler haben Sie? Wenn Sie den Linux 2.4-Kernel-Scheduler mit 2.6 vergleichen, erhalten Sie später einen O (1) -Plan ohne Abhängigkeit von der Anzahl der in einem System vorhandenen Aufgaben, während der erste eher ein O (n) ist. Daher spielen auch die SMP-Funktionen des Kernel-Zeitplans eine gute Rolle bei der maximalen Anzahl nachhaltiger Threads in einem System.

Jetzt können Sie Ihre Stapelgröße anpassen, um mehr Threads aufzunehmen, aber dann müssen Sie den Aufwand für die Thread-Verwaltung (Erstellung / Zerstörung und Planung) berücksichtigen. Sie können die CPU-Affinität zu einem bestimmten Prozess sowie zu einem bestimmten Thread erzwingen, um sie an bestimmte CPUs zu binden, um den Aufwand für die Thread-Migration zwischen den CPUs zu vermeiden und Probleme mit dem Kaltgeld zu vermeiden.

Beachten Sie, dass man auf Wunsch Tausende von Threads erstellen kann, aber wenn Linux keine VM mehr hat, werden nur zufällig Prozesse (also Threads) beendet. Dies soll verhindern, dass das Dienstprogrammprofil maximal genutzt wird. (Die Utility-Funktion informiert über das systemweite Utility für eine bestimmte Anzahl von Ressourcen. Bei konstanten Ressourcen in diesem Fall CPU-Zyklen und Speicher wird die Utility-Kurve mit immer mehr Aufgaben flacher.)

Ich bin sicher, dass der Windows-Kernel-Scheduler auch etwas in dieser Art unternimmt, um die Überauslastung der Ressourcen zu beheben

[1] http://adywicaksono.wordpress.com/2007/07/10/i-can-not-create-more-than-255-threads-on-linux-what-is-the-solutions/

Jay D.
quelle
17

Wenn Ihre Threads ressourcenintensive Arbeiten ausführen (CPU / Festplatte), werden Sie selten Vorteile sehen, die über ein oder zwei hinausgehen, und zu viele beeinträchtigen die Leistung sehr schnell.

Der "beste Fall" ist, dass Ihre späteren Threads blockieren, während die ersten abgeschlossen sind, oder dass einige Blöcke mit geringem Overhead für Ressourcen mit geringen Konflikten haben. Im schlimmsten Fall fangen Sie an, den Cache / die Festplatte / das Netzwerk zu zerstören, und Ihr Gesamtdurchsatz sinkt durch den Boden.

Eine gute Lösung besteht darin, Anforderungen in einem Pool zu platzieren, die dann aus einem Thread-Pool an Worker-Threads gesendet werden (und ja, die Vermeidung der kontinuierlichen Erstellung / Zerstörung von Threads ist ein guter erster Schritt).

Die Anzahl der aktiven Threads in diesem Pool kann dann basierend auf den Ergebnissen Ihrer Profilerstellung, der Hardware, auf der Sie ausgeführt werden, und anderen Dingen, die möglicherweise auf dem Computer auftreten, angepasst und skaliert werden.

Andrew Grant
quelle
Ja, und es sollte in Verbindung mit einer Warteschlange oder einem Pool von Anforderungen verwendet werden.
Andrew Grant
2
@ Andrew: Warum? Bei jedem Empfang einer Anforderung sollte dem Thread-Pool eine Aufgabe hinzugefügt werden. Es ist Sache des Thread-Pools, einen Thread für die Aufgabe zuzuweisen, wenn einer verfügbar ist.
GEOCHET
Was machen Sie also, wenn Hunderte von Anfragen eingehen und keine Threads mehr vorhanden sind? Mehr schaffen? Block? Fehler zurückgeben? Platzieren Sie Ihre Anforderungen in einem Pool, der so groß wie nötig sein kann, und geben Sie diese Anforderungen in der Warteschlange an Ihren Thread-Pool weiter, sobald die Threads frei werden.
Andrew Grant
"Eine Reihe von Threads wird erstellt, um eine Reihe von Aufgaben auszuführen, die normalerweise in einer Warteschlange organisiert sind. In der Regel gibt es viel mehr Aufgaben als Threads. Sobald ein Thread seine Aufgabe abgeschlossen hat, fordert er die nächste Aufgabe aus der Warteschlange an bis alle Aufgaben erledigt sind. "
GEOCHET
@ Andrew: Ich bin nicht sicher, welchen Python-Thread-Pool das OP verwendet, aber wenn Sie ein reales Beispiel für diese Funktionalität wünschen,
GEOCHET
10

Eine Sache, die Sie beachten sollten, ist, dass Python (zumindest die C-basierte Version) eine sogenannte globale Interpretersperre verwendet , die einen großen Einfluss auf die Leistung auf Multicore-Computern haben kann.

Wenn Sie wirklich das Beste aus Multithread-Python herausholen möchten, sollten Sie Jython oder ähnliches verwenden.

Chad Okere
quelle
4
Nachdem ich dies gelesen hatte, versuchte ich, Eratosthenes-Aufgaben auf drei Threads zu sieben. Sicher genug, es war tatsächlich 50% langsamer als das Ausführen derselben Aufgaben in einem einzelnen Thread. Danke für die Warnung. Ich habe Eclipse Pydev auf einer virtuellen Maschine ausgeführt, der zwei CPUs zugewiesen wurden. Als nächstes versuche ich ein Szenario, das einige Datenbankaufrufe beinhaltet.
Don Kirkby
3
Es gibt zwei (mindestens) Arten von Aufgaben: CPU-gebunden (z. B. Bildverarbeitung) und E / A-gebunden (z. B. Herunterladen aus dem Netzwerk). Offensichtlich wirkt sich das GIL- "Problem" nicht zu stark auf E / A-gebundene Aufgaben aus. Wenn Ihre Aufgaben CPU-gebunden sind, sollten Sie Multiprocessing anstelle von Multithreading in Betracht ziehen.
iutinvg
1
Ja, Python-Thread haben sich verbessert, wenn Sie viel Netzwerk-Io haben. Ich ändere es in Thread und habe 10 * schneller als gewöhnlicher Code ...
Tyan
8

Wie Pax zu Recht sagte, messen Sie, raten Sie nicht . Das, was ich für DNSwitness und die Ergebnisse getan habe, war überraschend: Die ideale Anzahl von Threads war viel höher als ich dachte, ungefähr 15.000 Threads, um die schnellsten Ergebnisse zu erzielen.

Natürlich hängt es von vielen Dingen ab, deshalb müssen Sie sich selbst messen.

Vollständige Maßnahmen (nur auf Französisch) in Combien de fils d'exécution? .

bortzmeyer
quelle
1
15.000? Das ist ein bisschen höher als ich erwartet hätte. Aber wenn es das ist, was du hast, dann ist es das, was du hast, damit kann ich nicht streiten.
Paxdiablo
2
Für diese spezielle Anwendung warten die meisten Threads nur auf eine Antwort vom DNS-Server. Je mehr Parallelität vorhanden ist, desto besser ist die Wanduhrzeit.
Bortzmeyer
18
Ich denke, wenn Sie diese 15000 Threads haben, die auf einer externen E / A blockieren, wäre eine bessere Lösung massiv weniger Threads, aber mit einem asynchronen Modell. Ich spreche hier aus Erfahrung.
Steve
5

Ich habe eine Reihe von Multithread-Apps geschrieben. Im Allgemeinen erlaube ich, dass die Anzahl potenzieller Threads durch eine Konfigurationsdatei angegeben wird. Wenn ich mich auf bestimmte Kunden eingestellt habe, habe ich die Anzahl so hoch eingestellt, dass meine Auslastung aller CPU-Kerne ziemlich hoch war, aber nicht so hoch, dass ich auf Speicherprobleme stieß (dies waren 32-Bit-Betriebssysteme bei der Zeit).

Anders ausgedrückt: Sobald Sie einen Engpass erreicht haben, sei es CPU, Datenbankdurchsatz, Festplattendurchsatz usw., wird das Hinzufügen weiterer Threads die Gesamtleistung nicht erhöhen. Aber bis Sie diesen Punkt erreicht haben, fügen Sie weitere Threads hinzu!

Beachten Sie, dass dies voraussetzt, dass die betreffenden Systeme für Ihre App reserviert sind und Sie andere Apps nicht gut spielen müssen (vermeiden, zu verhungern).

Matthew Lund
quelle
1
Können Sie einige der Zahlen erwähnen, die Sie für die Threadanzahl gesehen haben? Es wäre hilfreich, nur ein Gefühl dafür zu bekommen. Vielen Dank.
Kovac
3

Die Antwort "Big Iron" lautet im Allgemeinen ein Thread pro begrenzter Ressource - Prozessor (CPU-gebunden), Arm (E / A-gebunden) usw. -, aber das funktioniert nur, wenn Sie die Arbeit an den richtigen Thread für die Ressource weiterleiten können zugegriffen werden.

Wenn dies nicht möglich ist, denken Sie daran, dass Sie über fungible Ressourcen (CPUs) und nicht fungible Ressourcen (Arme) verfügen. Für CPUs ist es nicht kritisch, jeden Thread einer bestimmten CPU zuzuweisen (obwohl dies bei der Cache-Verwaltung hilfreich ist), aber für Arme, wenn Sie dem Arm keinen Thread zuweisen können, beginnen Sie mit der Warteschlangentheorie und der optimalen Anzahl, um Arme zu behalten beschäftigt. Im Allgemeinen denke ich, dass wenn Sie Anfragen basierend auf dem verwendeten Arm nicht weiterleiten können, 2-3 Threads pro Arm ungefähr richtig sind.

Eine Komplikation entsteht, wenn die an den Thread übergebene Arbeitseinheit keine einigermaßen atomare Arbeitseinheit ausführt. Beispielsweise kann der Thread an einem Punkt auf die Festplatte zugreifen und an einem anderen Punkt in einem Netzwerk warten. Dies erhöht die Anzahl der "Risse", in die zusätzliche Threads eindringen und nützliche Arbeit leisten können, erhöht jedoch auch die Möglichkeit, dass zusätzliche Threads die Caches usw. des anderen verschmutzen und das System blockieren.

Natürlich müssen Sie dies alles gegen das "Gewicht" eines Fadens abwägen. Leider haben die meisten Systeme sehr schwere Threads (und was sie "leichte Threads" nennen, sind oft überhaupt keine Threads), daher ist es besser, auf der niedrigen Seite zu irren.

Was ich in der Praxis gesehen habe, ist, dass sehr subtile Unterschiede einen enormen Unterschied darin machen können, wie viele Threads optimal sind. Insbesondere Cache-Probleme und Sperrkonflikte können die praktische Parallelität erheblich einschränken.

Hot Licks
quelle
2

Zu berücksichtigen ist, wie viele Kerne auf dem Computer vorhanden sind, auf dem der Code ausgeführt wird. Dies stellt eine feste Grenze für die Anzahl der Threads dar, die gleichzeitig ausgeführt werden können. Wenn jedoch wie in Ihrem Fall erwartet wird, dass Threads häufig darauf warten, dass eine Datenbank eine Abfrage ausführt, sollten Sie Ihre Threads wahrscheinlich basierend auf der Anzahl der gleichzeitigen Abfragen optimieren, die die Datenbank verarbeiten kann.

Newdayrising
quelle
2
ähm, nein. Der springende Punkt bei Threads war (bevor Multicore und mehrere Prozessoren vorherrschten), dass es möglich ist, mehrere Prozessoren auf einem Computer mit nur einem nachzuahmen. Auf diese Weise erhalten Sie reaktionsschnelle Benutzeroberflächen - einen Hauptthread und Nebenthreads.
mmr
1
@mmr: Ähm nein. Die Idee von Threads besteht darin, das Blockieren von E / A und anderen Aufgaben zu ermöglichen.
GEOCHET
4
Die Aussage, die ich gemacht habe, war, dass die Anzahl der Kerne auf einer Maschine eine harte Grenze für die Anzahl der Threads darstellt, die zu einem bestimmten Zeitpunkt arbeiten können, was eine Tatsache ist. Natürlich können andere Threads auf den Abschluss von E / A-Vorgängen warten, und für diese Frage ist dies eine wichtige Überlegung.
Newdayrising
1
Wie auch immer - Sie haben GIL in Python, wodurch Threads nur theoretisch parallel sind. Es kann nicht mehr als ein Thread gleichzeitig ausgeführt werden, daher sind nur die Reaktions- und Blockierungsvorgänge von Bedeutung.
Abgan
2
+1 Um tatsächlich zu verstehen, wie Computer funktionieren. @mmr: Sie müssen verstehen, dass der Unterschied zwischen mehreren Prozessoren und mehreren Prozessoren besteht. @Rich B: Ein Thread-Pool ist nur eine von vielen Möglichkeiten, eine Sammlung von Threads zu verarbeiten. Es ist gut, aber sicherlich nicht das einzige.
Trauer
2

Ich denke, das ist ein bisschen ein Ausweichen vor Ihrer Frage, aber warum nicht sie in Prozesse einteilen? Mein Verständnis von Netzwerken (aus den trüben Tagen von früher, ich codiere Netzwerke überhaupt nicht) war, dass jede eingehende Verbindung als separater Prozess behandelt werden kann, denn wenn dann jemand etwas Böses in Ihrem Prozess tut, tut es dies nicht nuke das gesamte Programm.

mmr
quelle
1
Für Python gilt dies insbesondere, da mehrere Prozesse parallel ausgeführt werden können, während mehrere Threads dies nicht tun. Die Kosten sind jedoch recht hoch. Sie müssen jedes Mal einen neuen Python-Interpreter starten und bei jedem Prozess eine Verbindung zur Datenbank herstellen (oder eine Pipes-Umleitung verwenden, die jedoch auch einen Preis hat).
Abgan
Das Wechseln zwischen Prozessen ist - meistens - teurer als das Wechseln zwischen Threads (vollständiger Kontextwechsel anstelle einiger Register). Am Ende hängt es stark von Ihrer Threading-Bibliothek ab. Da sich die Fragen um das Threading drehten, gehe ich davon aus, dass Prozesse bereits außer Frage stehen.
Leonidas
Meinetwegen. Ich bin mir nicht sicher, warum ich aus diesem Grund einen Wert von -2 für die Punktzahl bekomme, es sei denn, die Leute möchten wirklich nur Thread-Antworten sehen, anstatt andere Antworten einzuschließen, die funktionieren.
mmr
@mmr: In Anbetracht der Frage, ob es sich um / thread / pools handelt, denke ich, dass die Leute eine Antwort über Threads erwarten sollten.
GEOCHET
Die Prozesserstellung kann einmal beim Start erfolgen (dh ein Prozesspool anstelle eines Thread-Pools). Amortisiert über die Anwendungsdauer kann dies gering sein. Sie können Informationen nicht einfach teilen, aber es gibt ihnen die Möglichkeit, auf mehreren CPUs zu laufen, daher ist diese Antwort nützlich. +1.
Paxdiablo
1

Ryeguy, ich entwickle gerade eine ähnliche Anwendung und meine Thread-Nummer ist auf 15 gesetzt. Leider stürzt sie ab, wenn ich sie auf 20 erhöhe. Ja, ich denke, der beste Weg, dies zu handhaben, besteht darin, zu messen, ob Ihre aktuelle Konfiguration mehr oder weniger als eine Anzahl X von Threads zulässt.

hyperboreean
quelle
5
Das Hinzufügen zu Ihrer Thread-Anzahl sollte Ihre App nicht zufällig zum Absturz bringen. Es gibt einen Grund. Sie sollten die Ursache herausfinden, da sie Sie unter bestimmten Umständen sogar mit weniger Threads betreffen kann, wer weiß.
Matthew Lund
-6

In den meisten Fällen sollten Sie dem Thread-Pool erlauben, dies zu handhaben. Wenn Sie Code veröffentlichen oder weitere Details angeben, ist es möglicherweise einfacher festzustellen, ob das Standardverhalten des Thread-Pools aus irgendeinem Grund nicht am besten ist.

Weitere Informationen dazu finden Sie hier: http://en.wikipedia.org/wiki/Thread_pool_pattern

GEOCHET
quelle
1
@Pax: Dies wäre nicht das erste Mal, dass die Mehrheit der Menschen die vorliegende Frage nicht beantworten (oder verstehen) wollte. Ich mache mir keine Sorgen.
GEOCHET
-10

So viele Threads wie die CPU-Kerne habe ich sehr oft gehört.

masfenix
quelle
5
@Rich, erkläre zumindest warum :-). Diese Faustregel gilt nur, wenn alle Threads CPU-gebunden sind. Sie erhalten jeweils eine "CPU". Wenn viele der Threads E / A-gebunden sind, ist es normalerweise besser, viel mehr Threads als CPUs zu haben (CPU wird angegeben, da dies für physische Ausführungsthreads gilt, z. B. Kerne).
Paxdiablo
1
@Abgan, da war ich mir nicht sicher, weil ich dachte, Python würde vielleicht "echte" Betriebssystem-Threads erstellen (auf mehreren CPUs laufen). Wenn das, was Sie sagen, wahr ist (ich habe keinen Grund zu zweifeln), dann hat die CPU-Menge keine Bedeutung - Threading ist nur dann nützlich, wenn die meisten Threads auf etwas warten (z. B. DB I / O).
Paxdiablo
1
@Rich: Beim (echten) Threading hat die CPU-Anzahl Einfluss, da Sie mehrere nicht wartende Threads wirklich gleichzeitig ausführen können. Bei einer CPU wird nur eine ausgeführt, und der Vorteil besteht darin, dass viele andere Threads auf eine Nicht-CPU-Ressource warten.
Paxdiablo
1
@Pax: Du verstehst das Konzept der Thread-Pools nicht, denke ich.
GEOCHET
1
@ Rich, ich verstehe Thread-Pools gut; Es scheint, dass ich (und andere hier) auch Hardware besser verstehe als Sie. Mit einer CPU kann nur ein Ausführungsthread ausgeführt werden, selbst wenn andere auf eine CPU warten. Zwei CPUs, zwei können laufen. Wenn alle Threads auf eine CPU warten, ist die ideale Thread-Anzahl gleich ...
paxdiablo