Срок службы и обработка потоков Python

#python #multithreading #user-interface

Вопрос:

Я создал графический интерфейс для программы на python, которая может запускать 4 различных независимых вычисления. Я хочу, чтобы графический интерфейс был отзывчивым, пока вычисления выполняются в фоновом режиме, поэтому я создаю новый поток для каждого вычисления. Я также сохраняю некоторую дополнительную информацию о потоке (например, если он должен прервать вычисление).

Каждое вычисление также может выполняться несколько раз (либо после прерывания, либо после изменения некоторых настроек), что означает, что для каждого вычисления может быть создано несколько потоков.

Я не уверен, нужно ли мне явно присоединяться к каждому потоку с помощью .join() или поток завершается и присоединяется автоматически после завершения выполнения функции. Я не хочу, чтобы в конце моей программы было 100 потоков, если они автоматически не присоединятся к основному потоку после завершения.

Я знаю, что могу использовать thread.is_alive (), чтобы проверить, завершил ли поток выполнение, но я действительно не хочу писать какой-то сборщик мусора потока (который должен работать в своем собственном новом потоке … вздох), если мне не нужно. Я немного погуглил, но не могу найти документацию о времени жизни потока, если явно не использовать .join().

Ответ №1:

Ваш главный может выйти, и если это потоки демонов, они будут убиты нечисто.

Потоки могут выйти в любое время, и в этом случае соединение немедленно вернется.

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

В документах говорится: «вся программа Python завершается, когда остаются только потоки демонов».

И: Примечание: Потоки демонов резко останавливаются при завершении работы. Их ресурсы (такие как открытые файлы, транзакции базы данных и т.д.) Могут быть неправильно освобождены. Если вы хотите, чтобы ваши потоки изящно останавливались, сделайте их недемоническими и используйте подходящий механизм сигнализации, такой как событие

От: https://docs.python.org/3/library/threading.html

Но если вы просите потоки завершиться совместно, то вам следует присоединиться ко всем им, потому что вы хотите быть уверены, что они закончили чисто. Это возлагает на вас ответственность за разработку потоков, чтобы они завершались своевременно (т. Е. Не слишком удаляли пользователя) по запросу — но именно так работают потоки, не так ли?

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

1. это в основном означает, что мне нужно создать автоматический обработчик потоков. Самый простой способ, который я могу придумать для этого, — разрешить только один активный поток для каждой функции (с сигналами (проще всего было бы использовать глобальную переменную, которая отслеживает состояние потока, которое проверяется в цикле while вместо использования для циклов)). Когда окно tkinter уничтожается, все сигналы сообщают вычислениям о завершении и применяют объединение ко всем из них. Кажется ли это жизнеспособным подходом или есть лучшие способы справиться с этим?

2. (Возможно, глобальный) вариант;e, чтобы сохранить список потоков и единый механизм для запроса их остановки, кажется разумным.