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

_thread.md

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

1> **Источник:** https://python-all.ru/3.0/library/_thread.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `_thread` – низкоуровневое API потоков89Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми *легковесными процессами* или *задачами*) – несколькими потоками управления, разделяющими общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые *мьютексами* или *двоичными семафорами*). Модуль [`threading`](https://python-all.ru/3.0/library/threading.html#module-threading) предоставляет более простой и высокоуровневый API для работы с потоками, построенный на основе этого модуля.1011Модуль необязателен. Он поддерживается на Windows, Linux, SGI IRIX, Solaris 2.x, а также на системах, в которых реализованы потоки POSIX (также известные как «pthread»). Для систем, в которых нет модуля `_thread`, доступен модуль [`_dummy_thread`](https://python-all.ru/3.0/library/_dummy_thread.html#module-_dummy_thread). Он повторяет интерфейс этого модуля и может использоваться в качестве его замены без изменений.1213Он определяет следующие константу и функции:1415#### `[_thread.error]exception _thread.error`1617Возникает при ошибках, связанных с потоками.1819#### `[_thread.LockType]_thread.LockType`2021Это тип объектов блокировки.2223#### `[_thread.start_new_thread]_thread.start_new_thread(function, args[, kwargs])`2425Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию2627*function*2829со списком аргументов3031*args*3233(который должен быть кортежем). Необязательный аргумент3435*kwargs*3637задаёт словарь именованных аргументов. Когда функция возвращает управление, поток беззвучно завершается. Когда функция завершается из-за необработанного исключения, печатается трассировка стека, и поток завершается (но остальные потоки продолжают работу).3839#### `[_thread.interrupt_main]_thread.interrupt_main()`4041Генерирует исключение4243[`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt)4445в главном потоке. Дочерний поток может использовать эту функцию, чтобы прервать главный поток.4647#### `[_thread.exit]_thread.exit()`4849Генерирует исключение5051[`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit)5253. Если его не перехватить, это приведет к завершению потока без вывода сообщений.5455#### `[_thread.allocate_lock]_thread.allocate_lock()`5657Возвращает новый объект блокировки. Методы блокировок описаны ниже. Изначально блокировка не установлена.5859#### `[_thread.get_ident]_thread.get_ident()`6061Возвращает «идентификатор потока» текущего потока. Это ненулевое целое число. Его значение не имеет прямого смысла; оно предназначено в качестве «магического ключа» для использования, например, в качестве индекса в словаре данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы после завершения потока и создания другого.6263#### `[_thread.stack_size]_thread.stack_size([size])`6465Возвращает размер стека потока, используемый при создании новых потоков. Необязательный6667*size*6869аргумент задаёт размер стека для последующих создаваемых потоков и должен быть равен 0 (используется платформенное или сконфигурированное значение по умолчанию) или положительному целому числу не менее 32 768 (32 кБ). Если изменение размера стека потока не поддерживается, возбуждается7071`ThreadError`7273. Если указанный размер стека некорректен, возбуждается7475[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)7677, а размер стека не изменяется. 32 кБ – это минимальный поддерживаемый размер стека, гарантирующий достаточное пространство для самого интерпретатора. Обратите внимание, что некоторые платформы могут накладывать особые ограничения на значения размера стека, например, требовать минимальный размер \> 32 кБ или выделение памяти, кратное размеру страницы системной памяти – для получения дополнительных сведений следует обращаться к документации платформы (страницы по 4 кБ распространены; при отсутствии более точной информации рекомендуется использовать размер стека, кратный 4096). Доступность: Windows, системы с потоками POSIX.7879Объекты блокировки имеют следующие методы:8081#### `[_thread.lock.acquire]lock.acquire([waitflag])`8283Без необязательного аргумента этот метод захватывает блокировку безусловно, при необходимости ожидая, пока она не будет освобождена другим потоком (только один поток в единицу времени может захватить блокировку – в этом и состоит смысл их существования). Если присутствует целочисленный аргумент8485*waitflag*8687, действие зависит от его значения: если он равен нулю, блокировка захватывается только в том случае, если её можно захватить немедленно без ожидания; если же он не равен нулю, блокировка захватывается безусловно, как и раньше. Возвращаемое значение –8889`True`9091, если блокировка успешно захвачена, и9293`False`9495в противном случае.9697#### `[_thread.lock.release]lock.release()`9899Освобождает блокировку. Блокировка должна быть захвачена ранее, но не обязательно тем же потоком.100101#### `[_thread.lock.locked]lock.locked()`102103Возвращает состояние блокировки:104105`True`106107, если она захвачена каким-либо потоком, и108109`False`110111в противном случае.112113В дополнение к этим методам объекты блокировок также можно использовать с помощью оператора [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with), например:114115```python116import _thread117118a_lock = _thread.allocate_lock()119120with a_lock:121    print("a_lock is locked while this executes")122```123124**Предостережения:**125126>127128- Потоки странным образом взаимодействуют с прерываниями: исключение [`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt) будет получено произвольным потоком. (Если доступен модуль [`signal`](https://python-all.ru/3.0/library/signal.html#module-signal), прерывания всегда направляются в главный поток.)129- Вызов [`sys.exit()`](https://python-all.ru/3.0/library/sys.html#sys.exit) или возбуждение исключения [`SystemExit`](https://python-all.ru/3.0/library/exceptions.html#exceptions.SystemExit) эквивалентен вызову [`exit()`](https://python-all.ru/3.0/library/constants.html#exit).130- Не все встроенные функции, которые могут блокироваться в ожидании ввода-вывода, позволяют выполняться другим потокам. (Самые популярные из них ([`time.sleep()`](https://python-all.ru/3.0/library/time.html#time.sleep), [`file.read()`](https://python-all.ru/3.0/library/stdtypes.html#file.read), [`select.select()`](https://python-all.ru/3.0/library/select.html#select.select)) работают как ожидается.)131- Невозможно прервать метод `acquire()` блокировки – исключение [`KeyboardInterrupt`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyboardInterrupt) возникнет после того, как блокировка будет захвачена.132- Когда основной поток завершается, выживание остальных потоков определяется системой. В SGI IRIX с собственной реализацией потоков они выживают. В большинстве других систем они уничтожаются без выполнения блоков [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) … [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally) и без вызова деструкторов объектов.133- Когда главный поток завершается, он не выполняет обычные действия по очистке (за исключением того, что предложения [`try`](https://python-all.ru/3.0/reference/compound_stmts.html#try) ... [`finally`](https://python-all.ru/3.0/reference/compound_stmts.html#finally) выполняются), и стандартные файлы ввода-вывода не сбрасываются.134