سؤال

أحاول تفريغ قائمة بجميع المواضيع النشطة بما في ذلك المجموعة الحالية لكل منها. يمكنني الحصول على قائمة بجميع مؤشرات الترابط باستخدام threading.enumerate () ، لكن لا يمكنني معرفة طريقة للوصول إلى المكدس من هناك.

الخلفية: يخاف تطبيق Zope/Plone من وقت لآخر ، ويستهلك 100 ٪ من وحدة المعالجة المركزية ويجب إعادة تشغيله. لدي شعور بأنها حلقة لا تنتهي بشكل صحيح ، لكن لا يمكنني إعادة إنتاجها في اختبار الاختبار للتحقق. تمكنت من تسجيل معالج الإشارة يمكن تشغيله من الخارج ، حتى أتمكن من تشغيل بعض التعليمات البرمجية بمجرد حدوث الموقف مرة أخرى. إذا تمكنت من تفريغ StackTrace لجميع المواضيع النشطة ، فهذا من شأنه أن يعطيني فكرة عن الخطأ. يمتد الشيء على ثعبان 2.4 ...

أي أفكار حول كيفية تتبع المواقف مثل هذه هي موضع تقدير :)

هتاف ، كريس

هل كانت مفيدة؟

المحلول

عند استخدام Zope ، تريد التثبيت Products.signalstack أو السيد جليد; ؛ تم تصميم هذه لهذا الغرض فقط!

أرسل إشارة usr1 إلى خادم Zope الخاص بك وسيقوم على الفور بتفريغ آثار المكدس لجميع مؤشرات الترابط إلى وحدة التحكم. سيفعل ذلك حتى لو تم حبس جميع خيوط Zope.

تحت غطاء المحرك هذه الحزم بشكل غير مباشر threadframes; ؛ لإصدارات بيثون 2.5 وما فوق ليس باستخدام Zope ، يمكنك بناء نفس الوظيفة باستخدام sys._current_frames() وظيفة للوصول إلى إطارات المكدس لكل تراكم.

اعتبارا من Zope 2.12.5 تم دمج هذه الوظيفة في Zope نفسها ، وليس هناك حاجة لتثبيت حزم إضافية بعد الآن.

نصائح أخرى

كما يشير Jitter في إجابة سابقة sys._current_frames() يمنحك ما تحتاجه لـ V2.5+. بالنسبة إلى Lazy ، عملت قصاصة الكود التالية من أجلي وقد تساعدك:

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"

لبيثون 3.3 وبعد ذلك ، هناك faulthandler.dump_traceback().

ينتج الرمز أدناه إخراج مماثل ، ولكنه يتضمن اسم مؤشر الترابط ويمكن تحسينه لطباعة المزيد من المعلومات.

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

2.4. مؤسف جدا. من بيثون 2.5 فصاعدا هناك sys._current_frames().

لكن يمكنك المحاولة ThreadFrame. وإذا كان Makefile يمنحك مشكلة فيمكنك تجربة هذا SETUP.PY لـ ThreadFrame

عينة الإخراج عند استخدام ThreadFrame

فقط من أجل الاكتمال ، المنتجات. longrequestlogger من المفيد للغاية تحديد الاختناقات ، وللقيام بذلك ، فإنه يتفريغ على فترات زمنية محددة.

هناك وصفة قابلة للتطبيق على ASPN. يمكنك استخدام threading.enumerate() للحصول على جميع TIDs ، ثم اتصل فقط _async_raise () مع بعض الاستثناءات المناسبة لإجبار تتبع المكدس.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top