Wann sind Python-Threads schnell?

8

Wir alle sind uns der Schrecken der GIL bewusst, und ich habe eine Menge Diskussionen über das Thema gesehen richtige Zeit, um das multiprocessing Modul zu verwenden, aber ich habe immer noch nicht das Gefühl, dass ich eine gute Intuition darüber habe, wenn Threading in Python (hauptsächlich mit CPython) die richtige Antwort ist.

In welchen Fällen ist die GIL kein bedeutender Engpass? Was sind die Arten von Anwendungsfällen, in denen Threading am besten geeignet ist?

    
mvanveen 24.01.2012, 21:28
quelle

4 Antworten

11

Threading macht wirklich nur Sinn, wenn Sie eine Menge blockierender I / O haben. Wenn das der Fall ist, können einige Threads schlafen, während andere Threads arbeiten. Wenn Threads CPU-gebunden sind, werden Sie vom Multithreading wahrscheinlich nicht viel profitieren.

Beachten Sie, dass das Modul Multiprocessing , obwohl es schwieriger zu codieren ist, separate Prozesse verwendet und daher nicht funktioniert Die Nachteile der GIL leiden nicht.

    
Michael Mior 24.01.2012, 21:32
quelle
8

Da Sie nach Beispielen zu suchen scheinen, sind hier einige von meinem Kopf und ich habe mich auf die Suche nach CPU-gebundenen und I / O-gebundenen Beispielen gemacht (ich kann nicht viele finden). Ich bin kein Experte, also zögern Sie nicht, etwas zu korrigieren, das ich falsch kategorisiert habe. Es ist auch erwähnenswert, dass fortschreitende Technologie ein Problem von einer Kategorie in eine andere verschieben kann.

CPU-gebundene Aufgaben (verwenden Sie multiprocessing )

  • Numerische Methoden / Approximationen für mathematische Funktionen (Berechnung von Ziffern von Pi usw.)
  • Bildverarbeitung
  • Durchführen von Faltungen
  • Berechnen von Transformationen für die Grafikprogrammierung (möglicherweise von der GPU übernommen)
  • Audio- / Videokomprimierung / -dekomprimierung

E / A-gebundene Aufgaben ( threading ist wahrscheinlich in Ordnung)

  • Senden von Daten über ein Netzwerk
  • Schreiben / Lesen von der Festplatte
  • Nach Benutzereingabe fragen
  • Audio / Video-Streaming
aganders3 24.01.2012 21:55
quelle
1

Die GIL verhindert, dass python mehrere Threads ausführt.

Wenn Ihr Code die GIL vor dem Sprung in eine C-Erweiterung freigibt, können andere Python-Threads weiterlaufen, während der C-Code ausgeführt wird. Wie bei der blockierenden IO, die andere Leute erwähnt haben.

Ctypes macht das automatisch und tut auch numpy . Wenn Ihr Code sie also sehr oft verwendet, kann es durch die GIL nicht wesentlich eingeschränkt werden.

    
mdaoust 24.01.2012 22:37
quelle
0

Neben den CPU-gebundenen und E / A-gebundenen Tasks gibt es noch weitere Anwendungsfälle. Zum Beispiel aktiviert thread gleichzeitige Aufgaben . Eine Menge GUI-Programmierung fällt in diese Kategorie. Die Hauptschleife muss auf Mausereignisse reagieren. Wenn Sie also eine Aufgabe haben, die eine Weile dauert und Sie die Benutzeroberfläche nicht einfrieren wollen, tun Sie dies in einem separaten Thread. Es geht weniger um Leistung als um Parallelität.

    
Wai Yip Tung 24.01.2012 22:25
quelle

Tags und Links