_thread.md
1> **Источник:** https://python-all.ru/3.11/library/_thread.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`_thread`](https://python-all.ru/3.11/library/_thread.html#module-_thread) – Низкоуровневый API для работы с потоками89---1011Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми *легковесными процессами* или *задачами*) – множеством потоков управления, разделяющих общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые *мьютексами* или *двоичными семафорами*). Модуль [`threading`](https://python-all.ru/3.11/library/threading.html#module-threading) предоставляет более простой и высокоуровневый API для работы с потоками, построенный на основе этого модуля.1213Изменено в версии 3.7: Ранее этот модуль был опциональным, теперь он всегда доступен.1415Этот модуль определяет следующие константы и функции:1617#### `exception _thread.error`1819Возникает при ошибках, связанных с потоками.2021Изменено в версии 3.3: Теперь это синоним встроенного [`RuntimeError`](https://python-all.ru/3.11/library/exceptions.html#RuntimeError).2223#### `_thread.LockType`2425Это тип объектов блокировки.2627#### `_thread.start_new_thread(function, args[, kwargs])`2829Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию *function* со списком аргументов *args* (который должен быть кортежем). Необязательный аргумент *kwargs* задает словарь именованных аргументов.3031Когда функция завершается, поток незаметно завершается.3233Когда функция завершается необработанным исключением, вызывается [`sys.unraisablehook()`](https://python-all.ru/3.11/library/sys.html#sys.unraisablehook) для его обработки. Атрибут *object* аргумента hook равен *function*. По умолчанию печатается трассировка стека, после чего поток завершается (но другие потоки продолжают работу).3435Когда функция вызывает исключение [`SystemExit`](https://python-all.ru/3.11/library/exceptions.html#SystemExit), оно игнорируется без уведомления.3637Изменено в версии 3.8: Теперь для обработки необработанных исключений используется [`sys.unraisablehook()`](https://python-all.ru/3.11/library/sys.html#sys.unraisablehook).3839#### `_thread.interrupt_main(signum=signal.SIGINT, /)`4041Имитирует эффект поступления сигнала в главный поток. Поток может использовать эту функцию для прерывания главного потока, хотя нет гарантии, что прерывание произойдет немедленно.4243Если задан, *signum* – номер сигнала для имитации. Если *signum* не задан, имитируется [`signal.SIGINT`](https://python-all.ru/3.11/library/signal.html#signal.SIGINT).4445Если указанный сигнал не обрабатывается Python (установлен в [`signal.SIG_DFL`](https://python-all.ru/3.11/library/signal.html#signal.SIG_DFL) или [`signal.SIG_IGN`](https://python-all.ru/3.11/library/signal.html#signal.SIG_IGN)), эта функция ничего не делает.4647Изменено в версии 3.10: Добавлен аргумент *signum* для настройки номера сигнала.4849> **Примечание**50>51> Это не генерирует соответствующий сигнал, а планирует вызов связанного обработчика (если он существует). Если нужно действительно сгенерировать сигнал, используйте [`signal.raise_signal()`](https://python-all.ru/3.11/library/signal.html#signal.raise_signal).5253#### `_thread.exit()`5455Вызывает исключение [`SystemExit`](https://python-all.ru/3.11/library/exceptions.html#SystemExit). Если оно не перехвачено, поток завершится без уведомления.5657#### `_thread.allocate_lock()`5859Возвращает новый объект блокировки. Методы блокировок описаны ниже. Изначально блокировка не установлена.6061#### `_thread.get_ident()`6263Возвращает «идентификатор потока» текущего потока. Это ненулевое целое число. Его значение не имеет прямого смысла; оно предназначено в качестве «магического ключа» для использования, например, в качестве индекса в словаре данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы после завершения потока и создания другого.6465#### `_thread.get_native_id()`6667Возвращает нативный целочисленный идентификатор потока, назначенный ядром для текущего потока. Это неотрицательное целое число. Его значение может использоваться для уникальной идентификации данного потока в системе (пока поток не завершится, после чего значение может быть повторно использовано ОС).6869[Доступность](https://python-all.ru/3.11/library/intro.html#availability): Windows, FreeBSD, Linux, macOS, OpenBSD, NetBSD, AIX.7071Новое в версии 3.8.7273#### `_thread.stack_size([size])`7475Возвращает размер стека потока, используемый при создании новых потоков. Необязательный аргумент *size* задаёт размер стека для впоследствии создаваемых потоков и должен быть равен 0 (используется платформенное или настроенное значение по умолчанию) или положительному целому числу не менее 32 768 (32 КиБ). Если *size* не указан, используется 0. Если изменение размера стека не поддерживается, возбуждается [`RuntimeError`](https://python-all.ru/3.11/library/exceptions.html#RuntimeError). Если указанный размер стека некорректен, возбуждается [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), а размер стека остаётся без изменений. 32 КиБ – это минимально поддерживаемый размер стека, достаточный для самого интерпретатора. Имейте в виду, что на некоторых платформах могут быть особые ограничения на значения размера стека, например, требование минимального размера больше 32 КиБ или выделения памяти кратно размеру системной страницы памяти – за более подробной информацией следует обращаться к документации платформы (обычно используются страницы по 4 КиБ; при отсутствии более точных сведений рекомендуется задавать размер стека кратно 4096).7677[Доступность](https://python-all.ru/3.11/library/intro.html#availability): Windows, pthreads.7879Unix-платформы с поддержкой потоков POSIX.8081#### `_thread.TIMEOUT_MAX`8283Максимально допустимое значение для параметра *timeout* функции [`Lock.acquire`](https://python-all.ru/3.11/library/threading.html#threading.Lock.acquire). Если указать таймаут больше этого значения, будет возбуждено [`OverflowError`](https://python-all.ru/3.11/library/exceptions.html#OverflowError).8485Новое в версии 3.2.8687Объекты блокировки имеют следующие методы:8889#### `lock.acquire(blocking=True, timeout=-1)`9091Без необязательных аргументов этот метод захватывает блокировку безусловно, при необходимости ожидая, пока она не будет освобождена другим потоком (только один поток за раз может захватить блокировку – в этом и состоит их смысл).9293Если аргумент *blocking* задан, действие зависит от его значения: если он равен False, блокировка захватывается только в том случае, если её можно захватить немедленно без ожидания; если же он равен True, блокировка захватывается безусловно, как описано выше.9495Если аргумент *timeout* с плавающей запятой задан и положителен, он задаёт максимальное время ожидания в секундах до возврата. Отрицательный аргумент *timeout* задаёт неограниченное ожидание. Нельзя указать *timeout*, если *blocking* равен False.9697Возвращаемое значение равно `True`, если блокировка успешно захвачена, и `False` в противном случае.9899Изменено в версии 3.2: Параметр *timeout* является новым.100101Изменено в версии 3.2: Захват блокировки теперь может прерываться сигналами на POSIX.102103#### `lock.release()`104105Освобождает блокировку. Блокировка должна быть захвачена ранее, но не обязательно тем же потоком.106107#### `lock.locked()`108109Возвращает состояние блокировки: `True`, если она захвачена каким-либо потоком, `False` в противном случае.110111В дополнение к этим методам объекты блокировки можно также использовать с помощью оператора [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with), например:112113```python114import _thread115116a_lock = _thread.allocate_lock()117118with a_lock:119 print("a_lock is locked while this executes")120```121122**Предостережения:**123124- Потоки странно взаимодействуют с прерываниями: исключение [`KeyboardInterrupt`](https://python-all.ru/3.11/library/exceptions.html#KeyboardInterrupt) будет получено произвольным потоком. (Когда модуль [`signal`](https://python-all.ru/3.11/library/signal.html#module-signal) доступен, прерывания всегда направляются в главный поток.)125- Вызов [`sys.exit()`](https://python-all.ru/3.11/library/sys.html#sys.exit) или возбуждение исключения [`SystemExit`](https://python-all.ru/3.11/library/exceptions.html#SystemExit) эквивалентно вызову [`_thread.exit()`](https://python-all.ru/3.11/library/_thread.html#thread.exit).126- Невозможно прервать метод [`acquire()`](https://python-all.ru/3.11/library/threading.html#threading.Lock.acquire) для блокировки – исключение [`KeyboardInterrupt`](https://python-all.ru/3.11/library/exceptions.html#KeyboardInterrupt) произойдёт после того, как блокировка будет захвачена.127- При завершении главного потока решение о том, будут ли существовать другие потоки, зависит от системы. В большинстве систем они уничтожаются без выполнения предложений [`try`](https://python-all.ru/3.11/reference/compound_stmts.html#try) … [`finally`](https://python-all.ru/3.11/reference/compound_stmts.html#finally) или вызова деструкторов объектов.128- При завершении главного потока он не выполняет никакой обычной очистки (за исключением того, что предложения [`try`](https://python-all.ru/3.11/reference/compound_stmts.html#try) … [`finally`](https://python-all.ru/3.11/reference/compound_stmts.html#finally) соблюдаются), и стандартные файлы ввода-вывода не сбрасываются.129