Op fäden nicht Vertragen

Wenn Sie über einen Vorgang verfügen, der intern parallelisiert werden kann, z. B. Matrixmultiplikation (tf.matmul()) oder eine Reduktion (z. B. tf.reduce_sum()), führt TensorFlow ihn aus, indem Estasks in einem Threadpool mit intra_op_parallelism_threads Threads geplant wird. Diese Konfigurationsoption steuert daher die maximale parallele Beschleunigung für einen einzelnen Vorgang. Beachten Sie, dass diese Vorgänge diesen Threadpool gemeinsam nutzen, wenn Sie mehrere Vorgänge parallel ausführen. Race-Bedingungen können auch auftreten, wenn Sie die Aktivitäten mehrerer Threads synchronisieren. Wenn Sie eine Codezeile schreiben, müssen Sie überlegen, was passieren kann, wenn ein Thread vor der Ausführung der Zeile (oder vor einer der einzelnen Maschinenanweisungen, aus denen die Zeile besteht) und ein anderer Thread sie überholt hat. Multithreading erfordert eine sorgfältige Programmierung.

Bei den meisten Aufgaben können Sie die Komplexität reduzieren, indem Sie Anforderungen für die Ausführung durch Threadpoolthreads in die Warteschlange stellen. In diesem Thema werden schwierigere Situationen behandelt, z. B. die Koordination der Arbeit mehrerer Threads oder die Behandlung von Threads, die blockieren. Die inter_op_parallelism_threads- und intra_op_parallelism_threads Optionen werden in der Quelle der tf dokumentiert. ConfigProto-Protokollpuffer. Diese Optionen konfigurieren zwei Threadpools, die von TensorFlow verwendet werden, um die Ausführung zu parallelisieren, wie die Kommentare beschreiben: Um die Dinge noch schlimmer zu machen, sitzen die im Leerlauf befindlichen “Threads” nicht passiv im Speicher und warten leise darauf, von Ihrem neuronalen Prozessor beschworen zu werden, sie sind stattdessen eine aktive Präsenz, die Mitten in der Nacht Angst erzeugt und Ihre Aufmerksamkeit auf sich zieht. Um Es mit David Allen zu sagen: Je mehr Verpflichtungen in eurem Kopf lauern, desto mehr psychische Nabe fordern sie.

Bestimmte Operationen wie Matrixmultiplikation und Reduktionen können parallele Threads für Geschwindigkeitsüberschreitungen verwenden. Der Wert 0 bedeutet, dass das System eine entsprechende Zahl auswählt. Verwenden Sie Thread.Abort nicht, um andere Threads zu beenden. Das Aufrufen von Abbrechen in einem anderen Thread ähnelt dem Auslösen einer Ausnahme für diesen Thread, ohne zu wissen, welchen Punkt dieser Thread bei der Verarbeitung erreicht hat. Diese spezielle Racebedingung kann leicht vermieden werden, indem Methoden der Interlocked-Klasse verwendet werden, z. B. Interlocked.Increment. Weitere Informationen zu anderen Techniken zum Synchronisieren von Daten zwischen mehreren Threads finden Sie unter Synchronisieren von Daten für Multithreading. Eine Klasse wird erst initialisiert, wenn ihr Klassenkonstruktor (statischer Konstruktor in C, Shared Sub New in Visual Basic) die Ausführung beendet hat. Um die Ausführung von Code für einen Typ zu verhindern, der nicht initialisiert wird, blockiert die Common Language Runtime alle Aufrufe anderer Threads an statische Member der Klasse (Gemeinsame Member in Visual Basic), bis der Klassenkonstruktor die Ausführung abgeschlossen hat.

Verwenden Sie mehrere Threads für Aufgaben, die unterschiedliche Ressourcen erfordern, und vermeiden Sie das Zuweisen mehrerer Threads zu einer einzelnen Ressource. Beispielsweise profitiert jede Aufgabe mit E/A-Vorgängen von einem eigenen Thread, da dieser Thread während E/A-Vorgängen blockiert wird und somit die Ausführung anderer Threads ermöglicht. Benutzereingabe ist eine weitere Ressource, die von einem dedizierten Thread profitiert. Auf einem Computer mit einem Prozessor koexistiert eine Aufgabe, die eine intensive Berechnung umfasst, mit Benutzereingaben und Aufgaben, die E/A-Vorgänge beinhalten, aber mehrere rechenintensive Aufgaben konkurrieren miteinander. tf.compat.v1.config.threading.get_intra_op_parallelism_threads Steuern Sie nicht die Ausführung von Arbeitsthreads aus Ihrem Hauptprogramm (z. B. mithilfe von Ereignissen).