Frage

Ich versuche, eine Liste aller aktiven Threads einschließlich des aktuellen Stapels von jedem zu entsorgen. Ich kann eine Liste aller Threads mit Threading erhalten. Enumerate (), aber ich kann keinen Weg finden, um von dort aus zum Stapel zu gelangen.

Hintergrund: Eine Zope/Plone -App macht von Zeit zu Zeit aus, verbraucht 100% der CPU und muss neu gestartet werden. Ich habe das Gefühl, dass es eine Schleife ist, die nicht richtig endet, aber ich kann sie in der Test-Enironemt zur Überprüfung nicht reproduzieren. Ich habe es geschafft, einen Signalhandler zu registrieren, der von außen ausgelöst werden kann, damit ich einen Code auslösen kann, sobald die Situation wieder auftritt. Wenn ich die Stacktrace für alle aktiven Threads abwerfen könnte, würde mir das eine Ahnung geben, was schief geht. Das Loch -Ding läuft auf Python 2.4 ...

Alle Ideen, wie man solche Situationen verfolgen, werden geschätzt :)

Prost, Chriss

War es hilfreich?

Lösung

Wenn Sie Zope verwenden, möchten Sie installieren Products.signalstack oder Mr. Freeze; Diese wurden nur für diesen Zweck ausgelegt!

Senden Sie ein UsR1 -Signal an Ihren Zope -Server und lassen Sie Stapelspuren für alle Threads sofort an die Konsole ab. Es wird dies auch dann tun, wenn alle Zope -Threads gesperrt sind.

Unter der Haube verwenden diese Pakete indirekt threadframes; Für Python -Versionen 2.5 und up, wann nicht Mit Zope können Sie dieselbe Funktionalität mit der erstellen sys._current_frames() Funktion zum Zugriff auf Per-Thread-Stapelrahmen.

Ab Zope 2.12.5 Diese Funktionalität ist in Zope selbst integriert, und es müssen keine zusätzlichen Pakete mehr installiert werden.

Andere Tipps

Wie Jitter in einer früheren Antwort betont sys._current_frames() Gibt Ihnen, was Sie für v2.5+brauchen. Für die Faulen hat der folgende Code -Snippet für mich funktioniert und kann Ihnen helfen:

print >> sys.stderr, "\n*** STACKTRACE - START ***\n"
code = []
for threadId, stack in sys._current_frames().items():
    code.append("\n# ThreadID: %s" % threadId)
    for filename, lineno, name, line in traceback.extract_stack(stack):
        code.append('File: "%s", line %d, in %s' % (filename,
                                                    lineno, name))
        if line:
            code.append("  %s" % (line.strip()))

for line in code:
    print >> sys.stderr, line
print >> sys.stderr, "\n*** STACKTRACE - END ***\n"

Für Python 3.3 und später gibt es faulthandler.dump_traceback().

Der folgende Code erzeugt eine ähnliche Ausgabe, enthält jedoch den Threadnamen und könnte erweitert werden, um weitere Informationen zu drucken.

for th in threading.enumerate():
    print(th)
    traceback.print_stack(sys._current_frames()[th.ident])
    print()

2.4. Schade. Von Python 2.5 gibt es da sys._current_frames().

Aber du könntest es versuchen Fadenrahmen. Und wenn das Makefile Ihnen Probleme hat, können Sie dies versuchen Setup.py für Threadframe

Beispielausgabe bei Verwendung von Threadframe

Nur aus Vollständigkeit, willen, Produkte.LongRequestLogger ist super hilfreich, um Engpässe zu identifizieren, und damit wird in bestimmten Abständen Stacktraces ausgedehnt.

Es gibt ein anwendbares Rezept auf Aspn. Sie können verwenden threading.enumerate() Um alle TIDs zu erhalten, rufen Sie einfach _aSync_raise () mit einer geeigneten Ausnahme an, um eine Stapelspur zu erzwingen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top