_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