Spec-Zone.ru › Python 3.6

_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 (использовать платформенный или настроенный по умолчанию) или положительным целым значением не менее 32 768 (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.6/library/_thread.html

Spec-Zone.ru

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