Документация Python неофициальный перевод

_thread.md

100 строк · 13.0 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.3/library/_thread.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 17.10. [`_thread`](https://python-all.ru/3.3/library/_thread.html#module-_thread) – низкоуровневый API многопоточности89Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми *легковесными процессами* или *задачами*) – несколькими потоками управления, разделяющими общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые *мьютексами* или *двоичными семафорами*). Модуль [`threading`](https://python-all.ru/3.3/library/threading.html#module-threading) предоставляет более простой и высокоуровневый API для работы с потоками, построенный на основе этого модуля.1011Модуль является необязательным. Он поддерживается на Windows, Linux, SGI IRIX, Solaris 2.x, а также на системах, в которых есть реализация потоков POSIX (также известных как «pthread»). Для систем, в которых отсутствует модуль [`_thread`](https://python-all.ru/3.3/library/_thread.html#module-_thread), доступен модуль [`_dummy_thread`](https://python-all.ru/3.3/library/_dummy_thread.html#module-_dummy_thread). Он дублирует интерфейс этого модуля и может использоваться как его замена без дополнительных изменений.1213Он определяет следующие константы и функции:1415#### `exception _thread.error`1617Возникает при ошибках, связанных с потоками.1819Изменено в версии 3.3: Теперь это синоним встроенного исключения [`RuntimeError`](https://python-all.ru/3.3/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.3/library/exceptions.html#KeyboardInterrupt) в главном потоке. Дочерний поток может использовать эту функцию, чтобы прервать главный поток.3233#### `_thread.exit()`3435Генерирует исключение [`SystemExit`](https://python-all.ru/3.3/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 КиБ). Если изменение размера стека потока не поддерживается, возбуждается [`RuntimeError`](https://python-all.ru/3.3/library/exceptions.html#RuntimeError). Если указанный размер стека некорректен, возбуждается [`ValueError`](https://python-all.ru/3.3/library/exceptions.html#ValueError), и размер стека не изменяется. В настоящее время 32 КиБ – это минимальный поддерживаемый размер стека, гарантирующий достаточное пространство стека для самого интерпретатора. Обратите внимание, что на некоторых платформах могут действовать особые ограничения на значения размера стека, например, требование минимального размера стека \> 32 КиБ или требование выделения памяти, кратного размеру страницы системной памяти; для получения дополнительной информации следует обращаться к документации платформы (страницы по 4 КиБ распространены; при отсутствии более конкретной информации рекомендуется использовать значения размера стека, кратные 4096). Доступность: Windows, системы с POSIX-потоками.4849#### `_thread.TIMEOUT_MAX`5051Максимально допустимое значение для параметра *timeout* метода `Lock.acquire()`. Указание таймаута больше этого значения приведет к возбуждению исключения [`OverflowError`](https://python-all.ru/3.3/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.3/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.3/library/exceptions.html#KeyboardInterrupt) будет получено произвольным потоком. (Если доступен модуль [`signal`](https://python-all.ru/3.3/library/signal.html#module-signal), прерывания всегда направляются в главный поток.)95- Вызов [`sys.exit()`](https://python-all.ru/3.3/library/sys.html#sys.exit) или возбуждение исключения [`SystemExit`](https://python-all.ru/3.3/library/exceptions.html#SystemExit) эквивалентно вызову [`_thread.exit()`](https://python-all.ru/3.3/library/_thread.html#_thread.exit).96- Не все встроенные функции, которые могут блокироваться в ожидании ввода-вывода, позволяют выполняться другим потокам. (Наиболее популярные из них ([`time.sleep()`](https://python-all.ru/3.3/library/time.html#time.sleep), `io.FileIO.read()`, [`select.select()`](https://python-all.ru/3.3/library/select.html#select.select)) работают как ожидается.)97- Невозможно прервать метод `acquire()` блокировки – исключение [`KeyboardInterrupt`](https://python-all.ru/3.3/library/exceptions.html#KeyboardInterrupt) возникнет после того, как блокировка будет захвачена.98- Когда главный поток завершается, вопрос о том, выживают ли другие потоки, определяется системой. На большинстве систем они уничтожаются без выполнения предложений [`try`](https://python-all.ru/3.3/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) или деструкторов объектов.99- Когда главный поток завершается, он не выполняет обычные действия по очистке (за исключением того, что предложения [`try`](https://python-all.ru/3.3/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.3/reference/compound_stmts.html#finally) выполняются), и стандартные файлы ввода-вывода не сбрасываются.100