Многопоточность Python: «sys._current_frames()» против «threading.enumerate()»

#python #multithreading #celery

#python #многопоточность #сельдерей

Вопрос:

У меня есть программа, которая разветвляет несколько подпроцессов (если уж на то пошло, она использует Celery Workers). Я пытаюсь выгрузить трассировки стека всех запущенных потоков в каждом процессе. Я использую sys._current_frames() для получения трассировок стека и threading.enumerate() для получения имен потоков.

По какой-то причине я заметил, что в моих разветвленных подпроцессах у меня больше «фреймов», чем реальных потоков. Это нормально? Это просто «остатки» от форка? Это ошибка в Python? (для протокола протестировано на Mac OS X)

Спасибо, Z

Ответ №1:

Это ошибка 17094. Это должно быть исправлено в более поздних версиях Python.

Ответ №2:

Ну, документация sys._current_frames сначала немного объясняет кое-что

Эта функция должна использоваться только для внутренних и специализированных целей.

Так что на самом деле это не то, что вам следует использовать. И ключевой ответ приходит из документации threading.enumerate

Список включает демонические потоки, фиктивные объекты потоков, созданные current_thread(), и основной поток.

Комментарии:

1. Я ценю ваш ответ и действительно прочитал документацию. Дело в том, что sys._current_frames упоминается как инструмент для отладки. Я видел много фрагментов кода, которые используют это, и то, что я нашел, просто нарушает большинство из них.