Spec-Zone.ru › Python 3.7

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

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

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

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

exception _thread.error

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

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

_thread.LockType

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

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

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

_thread.interrupt_main()

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

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

_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 для размера стека является рекомендуемым подходом в отсутствие более конкретной информации).

Доступность: 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/_thread.html

Spec-Zone.ru

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