Что такое Dummy в threading.current_thread ()? - PullRequest
1 голос
/ 21 апреля 2019

Я пытаюсь понять код в этом Как правильно использовать QThread в pyqt с moveToThread ()?

Часть, которая имеет:

mainwin.__init__         : MainThread, 140221684574016,
GenericWorker.__init__   : MainThread, 140221684574016,
GenericWorker.run        : Dummy-1, 140221265458944,
mainwin.addBatch         : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944,
mainwin.add              : Dummy-1, 140221265458944

Меня интересует, какие именно элементы Dummy -1 , я понимаю, что это рабочие потоки, выполняющие работу, но останутся ли они "живыми" навсегда?или они будут собирать мусор самостоятельно.Если добавление пакета было выполнено 10 тыс. Раз, будет ли в выводе кода 10 тыс. фиктивных-1 элементов?Я спрашиваю только потому, что видел аналогичные результаты при использовании подклассов Qthreads (использование Pydev в Eclispe при запуске кода в режиме отладки).

Я не уверен, означает ли это какую-то утечку (утечку потока), которая в конечном итоге потребляет много-много ресурсов.

1 Ответ

0 голосов
/ 21 апреля 2019

QThread не является потоком в Qt , но является классом, который служит для обработки собственных потоков каждой ОС, как и модуль потоков Python, и это упоминается в документах .:

Класс QThread предоставляет независимый от платформы способ управления потоками.

Поэтому при использовании threading.current_thread() python пытается получить собственный поток, но как документы указывают (и вы также можете увидеть это в исходном коде ):

Возвращает текущий объект Thread, соответствующий потоку вызывающегоконтроль.Если поток управления вызывающей стороны не был создан через модуль потоков, возвращается фиктивный объект потока с ограниченными функциональными возможностями.

, поскольку QThread создал поток, который не обрабатывается модулем потоков, который вернетфиктивный поток, представляющий поток.

Они хранятся в словаре внутри модуля потоков, поэтому они не будут удалены с помощью GC и не являются утечкой.Это упоминается в документах :

Существует вероятность создания «фиктивных объектов потока».Это объекты потоков, соответствующие «чужим потокам», которые являются потоками управления, запущенными вне модуля потоков, например непосредственно из кода Си.Фиктивные объекты потока имеют ограниченную функциональность;они всегда считаются живыми и демоническими и не могут быть объединены ().Они никогда не удаляются, так как невозможно обнаружить завершение чужих потоков.

А в исходный код :

# Dummy thread class to represent threads not started here.
# These aren't garbage collected when they die, nor can they be waited for.
# If they invoke anything in threading.py that calls current_thread(), they
# leave an entry in the _active dict forever after.
# Their purpose is to return *something* from current_thread().
# They are marked as daemon threads so we won't wait for them
# when we exit (conform previous semantics).

Таким образом, в заключение вымышленные элементы, которые предоставляют информацию о потоках, не обработанных потоками, на них не влияет GC, поскольку они хранятся в словаре и, следовательно, не являются утечкой памяти.

...