Spec-Zone.ru › Python 3.9

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

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

Изменено в версии 3.7: Этот модуль раньше был необязательным, теперь он всегда доступен.

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

exception _thread.error

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

Изменено в версии 3.3: Теперь это синоним встроенного RuntimeError.

_thread.LockType

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

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

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

Когда функция возвращает значение, поток молча завершается.

Когда функция завершается с необработанным исключением, вызывается sys.unraisablehook() для обработки исключения. Атрибут object аргумента хука — function. По умолчанию выводится трассировка стека, а затем поток завершается (но другие потоки продолжают выполняться).

Когда функция вызывает исключение SystemExit, оно молча игнорируется.

Изменено в версии 3.8: Для обработки необработанных исключений теперь используется sys.unraisablehook().

_thread.interrupt_main()

Имитирует эффект сигнала signal.SIGINT, поступающего в основной поток. Поток может использовать эту функцию для прерывания основного потока.

Если signal.SIGINT не обрабатывается Python (он был установлен в signal.SIG_DFL или signal.SIG_IGN), эта функция ничего не делает.

_thread.exit()

Вызывает исключение SystemExit. При отсутствии перехвата это заставит поток выйти молча.

_thread.allocate_lock()

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

_thread.get_ident()

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

_thread.get_native_id()

Возвращает целое число идентификатора потока ядра текущего потока, назначенное ядром. Это целое число, неотрицательное. Его значение может использоваться для уникальной идентификации этого конкретного потока в системе (до завершения потока, после чего значение может быть переиспользовано ОС).

Доступность: Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX.

Введено в версии 3.8.

_thread.stack_size([size])

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

Доступность: Windows, системы с POSIX-потоками.

_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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/_thread.html

Spec-Zone.ru

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