Запуск функции в отдельных потоках управления threading

Example

Класс Thread используется для представления отдельного потока управления. Новый поток можно создать вызовом конструктора: Thread(group=None, target=None, name=None, args=(), kwargs={}) — создает новый экземпляр класса Thread.

Аргумент group всегда получает значение None и зарезервирован для использования в будущем.

В аргументе target передается объект, который вызывается методом run() при запуске потока. По умолчанию задан как None — значит ничего вызываться не будет.

Аргумент name определяет имя потока. По умолчанию генерируется уникальное имя вида Thread-N. В args передается кортеж позиционных аргументов для функции target, а в kwargs — словарь именованных аргументов для нее же.

Пример того, как создавать и запускать функции (или другие вызываемые объекты) в отдельных потоках управления

Запуск потока в виде класса

Когда объявляется собственный класс потока, в котором переопределяется метод __init__(), важно вызвать конструктор базового класса super().__init__(), как показано в примере. Если этого не сделать, возникнет ошибка. Неверным будет и пытаться переопределить другие методы класса Thread, кроме run() и __init__().

Настройка атрибута daemon в этих примерах является характерной операцией при работе с потоками, которые выполняют бесконечный цикл. Обычно интерпретатор Python ожидает завершения всех потоков, прежде чем завершиться самому. Но если есть никогда не завершающиеся фоновые потоки, такое поведение нежелательно. Значение True в атрибуте daemon позволяет интерпретатору завершиться сразу после выхода из главной программы. В этом случае демонические потоки просто уничтожаются.

Методы и атрибуты экземпляра класса Thread

th.start() — запускает поток вызовом метода run() в отдельном потоке управления. Может вызываться только один раз.

th.run() — вызывается при запуске потока. По умолчанию вызывает функцию target, которая была передана конструктору. Можно создать свой класс, производный от Thread, и определить в нем собственную реализацию метода run().

th.join([timeout]) — ожидает завершения потока или истечения указанного интервала времени. Аргумент timeout определяет максимальный период ожидания в секундах — в виде числа с плавающей точкой. Поток не может присоединяться к самому себе. Ошибка — пытаться присоединиться к потоку до того, как он будет запущен. Чтобы проследить работу потока после вызова метода th.start(), необходимо также добавить вызов метода t.join(). Иначе приложение завершится сразу после запуска потока.

th.is_alive() — возвращает True, если поток t продолжает работу, и False в противном случае. Поток считается действующим от момента вызова метода start() до того, как завершится run();

th.name — имя потока. Этот атрибут используется только для идентификации и может принимать любые значения (желательно осмысленные, чтобы упростить отладку).

th.ident — целочисленный идентификатор потока. Если поток еще не был запущен, этот атрибут содержит значение None.

th.daemon — логический флаг, указывающий, будет ли поток демоническим. Значение этого атрибута должно устанавливаться до вызова метода start(). По умолчанию он получает значение, унаследованное от потока, создавшего его. Программа Python завершается, когда не осталось ни одного активного, не демонического потока управления. Любая программа имеет главный поток, представляющий первоначальный поток управления, который не является демоническим.


Теги: