_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