_thread.md
1> **Источник:** https://python-all.ru/3.4/library/_thread.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.9. [`_thread`](https://python-all.ru/3.4/library/_thread.html#module-_thread) – Низкоуровневый API для работы с потоками89Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми *легковесными процессами* или *задачами*) – несколькими потоками управления, разделяющими общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые *мьютексами* или *двоичными семафорами*). Модуль [`threading`](https://python-all.ru/3.4/library/threading.html#module-threading) предоставляет более простой и высокоуровневый API для работы с потоками, построенный на основе этого модуля.1011Модуль является необязательным. Он поддерживается на Windows, Linux, SGI IRIX, Solaris 2.x, а также на системах, в которых есть реализация потоков POSIX (также известных как «pthread»). Для систем, в которых отсутствует модуль [`_thread`](https://python-all.ru/3.4/library/_thread.html#module-_thread), доступен модуль [`_dummy_thread`](https://python-all.ru/3.4/library/_dummy_thread.html#module-_dummy_thread). Он дублирует интерфейс этого модуля и может использоваться как его замена без дополнительных изменений.1213Он определяет следующие константы и функции:1415#### `exception _thread.error`1617Возникает при ошибках, связанных с потоками.1819Изменено в версии 3.3: Теперь это синоним встроенного исключения [`RuntimeError`](https://python-all.ru/3.4/library/exceptions.html#RuntimeError).2021#### `_thread.LockType`2223Это тип объектов блокировки.2425#### `_thread.start_new_thread(function, args[, kwargs])`2627Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию *function* со списком аргументов *args* (который должен быть кортежем). Необязательный аргумент *kwargs* задаёт словарь именованных аргументов. Когда функция возвращает управление, поток беззвучно завершается. Когда функция завершается из-за необработанного исключения, печатается трассировка стека, и поток завершается (но остальные потоки продолжают работу).2829#### `_thread.interrupt_main()`3031Генерирует исключение [`KeyboardInterrupt`](https://python-all.ru/3.4/library/exceptions.html#KeyboardInterrupt) в главном потоке. Дочерний поток может использовать эту функцию, чтобы прервать главный поток.3233#### `_thread.exit()`3435Генерирует исключение [`SystemExit`](https://python-all.ru/3.4/library/exceptions.html#SystemExit). Если его не перехватить, это приведет к завершению потока без вывода сообщений.3637#### `_thread.allocate_lock()`3839Возвращает новый объект блокировки. Методы блокировок описаны ниже. Изначально блокировка не установлена.4041#### `_thread.get_ident()`4243Возвращает «идентификатор потока» текущего потока. Это ненулевое целое число. Его значение не имеет прямого смысла; оно предназначено в качестве «магического ключа» для использования, например, в качестве индекса в словаре данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы после завершения потока и создания другого.4445#### `_thread.stack_size([size])`4647Возвращает размер стека потока, используемый при создании новых потоков. Необязательный аргумент *size* задает размер стека для последующих создаваемых потоков и должен быть равен 0 (используется платформенное значение по умолчанию или настроенное значение) или положительному целому числу не менее 32 768 (32 КиБ). Если *size* не указан, используется 0. Если изменение размера стека потока не поддерживается, возбуждается [`RuntimeError`](https://python-all.ru/3.4/library/exceptions.html#RuntimeError). Если указанный размер стека некорректен, возбуждается [`ValueError`](https://python-all.ru/3.4/library/exceptions.html#ValueError), и размер стека не изменяется. 32 КиБ – это минимальное поддерживаемое в настоящее время значение размера стека, гарантирующее достаточное пространство стека для самого интерпретатора. Обратите внимание, что некоторые платформы могут иметь особые ограничения на значения размера стека, например, требовать минимальный размер стека \> 32 КиБ или выделение памяти, кратное размеру страницы системной памяти – для получения дополнительной информации следует обращаться к документации платформы (страницы по 4 КиБ распространены; при отсутствии более конкретной информации рекомендуется использовать размер стека, кратный 4096). Доступность: Windows, системы с потоками POSIX.4849#### `_thread.TIMEOUT_MAX`5051Максимально допустимое значение для параметра *timeout* метода `Lock.acquire()`. Указание таймаута больше этого значения приведет к возбуждению исключения [`OverflowError`](https://python-all.ru/3.4/library/exceptions.html#OverflowError).5253Новое в версии 3.2.5455Объекты блокировки имеют следующие методы:5657#### `lock.acquire(waitflag=1, timeout=-1)`5859Без необязательных аргументов этот метод захватывает блокировку безусловно, при необходимости ожидая, пока она не будет освобождена другим потоком (только один поток за раз может захватить блокировку – в этом и состоит их смысл).6061Если целочисленный аргумент *waitflag* присутствует, действие зависит от его значения: если он равен нулю, блокировка захватывается, только если её можно захватить немедленно без ожидания, тогда как если он не равен нулю, блокировка захватывается безусловно, как указано выше.6263Если аргумент с плавающей точкой *timeout* присутствует и положителен, он задаёт максимальное время ожидания в секундах перед возвратом. Отрицательное значение аргумента *timeout* задаёт неограниченное ожидание. Нельзя указать *timeout*, если *waitflag* равен нулю.6465Возвращаемое значение – `True`, если блокировка успешно захвачена, и `False` в противном случае.6667Изменено в версии 3.2: Параметр *timeout* является новым.6869Изменено в версии 3.2: Захват блокировки теперь может прерываться сигналами на POSIX.7071#### `lock.release()`7273Освобождает блокировку. Блокировка должна быть захвачена ранее, но не обязательно тем же потоком.7475#### `lock.locked()`7677Возвращает состояние блокировки: `True`, если она захвачена каким-либо потоком, и `False` в противном случае.7879В дополнение к этим методам объекты блокировок также можно использовать с помощью оператора [`with`](https://python-all.ru/3.4/reference/compound_stmts.html#with), например:8081```python82import _thread8384a_lock = _thread.allocate_lock()8586with a_lock:87 print("a_lock is locked while this executes")88```8990**Предостережения:**9192>9394- Потоки странным образом взаимодействуют с прерываниями: исключение [`KeyboardInterrupt`](https://python-all.ru/3.4/library/exceptions.html#KeyboardInterrupt) будет получено произвольным потоком. (Если доступен модуль [`signal`](https://python-all.ru/3.4/library/signal.html#module-signal), прерывания всегда направляются в главный поток.)95- Вызов [`sys.exit()`](https://python-all.ru/3.4/library/sys.html#sys.exit) или возбуждение исключения [`SystemExit`](https://python-all.ru/3.4/library/exceptions.html#SystemExit) эквивалентно вызову [`_thread.exit()`](https://python-all.ru/3.4/library/_thread.html#_thread.exit).96- Невозможно прервать метод `acquire()` блокировки – исключение [`KeyboardInterrupt`](https://python-all.ru/3.4/library/exceptions.html#KeyboardInterrupt) возникнет после того, как блокировка будет захвачена.97- Когда главный поток завершается, вопрос о том, выживают ли другие потоки, определяется системой. На большинстве систем они уничтожаются без выполнения предложений [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) или деструкторов объектов.98- Когда главный поток завершается, он не выполняет обычные действия по очистке (за исключением того, что предложения [`try`](https://python-all.ru/3.4/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.4/reference/compound_stmts.html#finally) выполняются), и стандартные файлы ввода-вывода не сбрасываются.99