_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 аргумента hook равен function. По умолчанию выводится трассировка стека, а затем поток завершается (но другие потоки продолжают работать).При возникновении исключения
SystemExitоно молча игнорируется.Изменено в версии 3.8:
sys.unraisablehook()теперь используется для обработки необработанных исключений.
-
_thread.interrupt_main(signum=signal.SIGINT, /) -
Имитирует действие сигнала, поступающего в основной поток. Поток может использовать эту функцию для прерывания основного потока, хотя нет гарантии, что прерывание произойдёт немедленно.
Если указано, signum — это номер сигнала для имитации. Если signum не указан, имитируется
signal.SIGINT.Если заданный сигнал не обрабатывается Python (он был установлен в
signal.SIG_DFLилиsignal.SIG_IGN), эта функция ничего не делает.Изменено в версии 3.10: Добавлен аргумент signum для настройки номера сигнала.
Примечание
Это не генерирует соответствующий сигнал, но планирует вызов связанного обработчика (если он существует). Если вы хотите действительно сгенерировать сигнал, используйте
signal.raise_signal().
-
_thread.exit() -
Вызывает исключение
SystemExit. При отсутствии перехвата это приведет к молчаливому завершению потока.
-
_thread.allocate_lock() -
Возвращает новый объект блокировки. Методы блокировок описаны ниже. Блокировка изначально разблокирована.
-
_thread.get_ident() -
Возвращает ‘идентификатор потока’ текущего потока. Это целое число, отличное от нуля. Его значение не имеет прямого смысла; оно предназначено для использования, например, для индексации словаря данных, специфичных для потока. Идентификаторы потоков могут быть переиспользованы при завершении потока и создании нового.
-
_thread.get_native_id() -
Возвращает целое число 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, pthreads.
Платформы Unix с поддержкой POSIX-потоков.
-
_thread.TIMEOUT_MAX -
Максимальное значение, разрешённое для параметра timeout функции
Lock.acquire. Указание значения таймаута больше этого значения приведёт к ошибкеOverflowError.Введено в версии 3.2.
Объекты блокировки имеют следующие методы:
-
lock.acquire(blocking=True, timeout=- 1) -
Без дополнительных аргументов этот метод приобретает блокировку безусловно, если это необходимо, ожидая, пока она не будет освобождена другим потоком (только один поток одновременно может приобрести блокировку — это их назначение).
Если аргумент blocking присутствует, действие зависит от его значения: если он равен False, блокировка приобретается только если она может быть приобретена немедленно без ожидания, а если он равен True, блокировка приобретается безусловно, как описано выше.
Если присутствует положительный плавающий аргумент timeout, он определяет максимальное время ожидания в секундах, прежде чем будет возвращено значение. Отрицательное значение timeout указывает неограниченное ожидание. Вы не можете указать timeout, если blocking равен False.
Возвращаемое значение —
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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/_thread.html