Spec-Zone.ru › Python 3.5

_thread — API потоков низкого уровня

Этот модуль предоставляет базовые примитивы для работы с несколькими потоками (также называемыми легковесными процессами или задачами) — несколько потоков управления, разделяющих общее адресное пространство данных. Для синхронизации предоставляются простые блокировки (также называемые мьютексами или двоичными семафорами). Модуль threading предоставляет более удобный и высокоуровневый API потоков, построенный поверх этого модуля.

Модуль является необязательным. Он поддерживается в Windows, Linux, SGI IRIX, Solaris 2.x, а также на системах, имеющих реализацию POSIX-потоков (также известную как “pthread”). Для систем, не имеющих модуль _thread, доступен модуль _dummy_thread. Он дублирует интерфейс этого модуля и может использоваться как замена.

Он определяет следующие константы и функции:

exception _thread.error

Выбрасывается при ошибках, специфичных для потоков.

Изменено в версии 3.3: Теперь это синоним встроенной ошибки RuntimeError.

_thread.LockType

Это тип объектов блокировки.

_thread.start_new_thread(function, args[, kwargs])

Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию function со списком аргументов args (который должен быть кортежем). Необязательный аргумент kwargs определяет словарь ключевых аргументов. Когда функция возвращается, поток тихо завершается. Когда функция завершается с необработанным исключением, выводится трассировка стека, а затем поток завершается (но другие потоки продолжают выполняться).

_thread.interrupt_main()

Выбрасывает исключение KeyboardInterrupt в главном потоке. Подпоток может использовать эту функцию для прерывания главного потока.

_thread.exit()

Выбрасывает исключение SystemExit. Если оно не перехвачено, это приведет к тихому завершению потока.

_thread.allocate_lock()

Возвращает новый объект блокировки. Методы блокировок описаны ниже. Блокировка изначально разблокирована.

_thread.get_ident()

Возвращает идентификатор потока текущего потока. Это целое число, отличное от нуля. Его значение не имеет прямого смысла; оно предназначено как магическая метка, которая используется, например, для индексирования словаря данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы при завершении потока и создании другого потока.

_thread.stack_size([size])

Возвращает размер стека потока, используемый при создании новых потоков. Необязательный аргумент size определяет размер стека для последующих создаваемых потоков и должен быть равен 0 (используется платформа или настроенное значение по умолчанию) или положительным целочисленным значением не менее 32768 (32 КБ). Если size не указан, используется 0. Если изменение размера стека потока не поддерживается, выбрасывается RuntimeError. Если указанный размер стека недействителен, выбрасывается ValueError, и размер стека не изменяется. В настоящее время 32 КБ — это минимальный поддерживаемый размер стека, чтобы гарантировать достаточный объем стека для самого интерпретатора. Обратите внимание, что на некоторых платформах могут быть определённые ограничения на значения размера стека, например, требование минимального размера стека > 32 КБ или требование к выделению кратным системному размеру страницы памяти. Для получения дополнительной информации следует обратиться к документации по платформе (размер страницы 4 КБ является распространённым; использование кратных 4096 для размера стека является рекомендуемым подходом в отсутствие более конкретной информации).

_thread.TIMEOUT_MAX

Максимальное значение, разрешенное для параметра timeout в Lock.acquire(). Указание таймаута, превышающего это значение, вызовет OverflowError.

Добавлена в версии 3.2.

Объекты блокировки имеют следующие методы:

lock.acquire(waitflag=1, timeout=-1)

Без дополнительных аргументов этот метод безусловно получает блокировку, если необходимо ожидая, пока другой поток ее освободит (только один поток за раз может получить блокировку — это их основная причина существования).

Если целочисленный аргумент waitflag присутствует, действие зависит от его значения: если оно равно нулю, блокировка приобретается только если ее можно получить немедленно без ожидания, а если оно отлично от нуля, блокировка приобретается безусловно, как указано выше.

Если присутствует положительный плавающей точкой аргумент timeout, он задает максимальное время ожидания в секундах, прежде чем возвратиться. Отрицательный аргумент timeout задает неограниченное ожидание. Вы не можете указать timeout, если waitflag равен нулю.

Значение возврата — True , если блокировка успешно приобретена, False если нет.

Изменено в версии 3.2: Параметр timeout новый.

Изменено в версии 3.2: Операции получения блокировки теперь могут быть прерваны сигналами в POSIX.

lock.release()

Освобождает блокировку. Блокировка должна быть получена ранее, но не обязательно тем же потоком.

lock.locked()

Возвращает статус блокировки: True если она была получена каким-то потоком, False если нет.

В дополнение к этим методам, объекты блокировки также могут быть использованы с помощью инструкции with, например:

import _thread

a_lock = _thread.allocate_lock()

with a_lock:
    print("a_lock is locked while this executes")

Ограничения:

  • Потоки странно взаимодействуют с прерываниями: исключение KeyboardInterrupt будет получено произвольным потоком. (Когда модуль signal доступен, прерывания всегда попадают в основной поток.)
  • Вызов sys.exit() или выброс исключения SystemExit эквивалентен вызову _thread.exit().
  • Невозможно прервать метод acquire() на блокировке — исключение KeyboardInterrupt произойдет после того, как блокировка будет получена.
  • При выходе главного потока определяется, выживут ли другие потоки. На большинстве систем они уничтожаются без выполнения инструкций try … finally или выполнения деструкторов объектов.
  • При выходе главного потока он не выполняет свою обычную очистку (за исключением того, что блоки try … finally соблюдаются), и стандартные файлы ввода-вывода не сбрасываются.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/_thread.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API