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

thread.md

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

1> **Источник:** https://python-all.ru/2.7/library/thread.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 16.3. [`thread`](https://python-all.ru/2.7/library/thread.html#module-thread) – Множество потоков управления89> **Примечание**10>11> Модуль [`thread`](https://python-all.ru/2.7/library/thread.html#module-thread) был переименован в `_thread` в Python 3. Инструмент [2to3](https://python-all.ru/2.7/glossary.html#term-2to3) будет автоматически адаптировать импорты при преобразовании исходных кодов в Python 3; однако следует рассмотреть использование высокоуровневого модуля [`threading`](https://python-all.ru/2.7/library/threading.html#module-threading) вместо этого.1213Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми *легковесными процессами* или *задачами*) – множеством потоков управления, разделяющих общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые *мьютексами* или *двоичными семафорами*). Модуль [`threading`](https://python-all.ru/2.7/library/threading.html#module-threading) предоставляет более простой и высокоуровневый API для работы с потоками, построенный на основе этого модуля.1415Модуль является опциональным. Он поддерживается в Windows, Linux, SGI IRIX, Solaris 2.x, а также в системах, имеющих реализацию POSIX-потоков (также известных как «pthread»). Для систем, в которых отсутствует модуль [`thread`](https://python-all.ru/2.7/library/thread.html#module-thread), доступен модуль [`dummy_thread`](https://python-all.ru/2.7/library/dummy_thread.html#module-dummy_thread). Он дублирует интерфейс данного модуля и может использоваться в качестве замены «на лету».1617Он определяет следующие константу и функции:1819#### `exception thread.error`2021Возникает при ошибках, связанных с потоками.2223#### `thread.LockType`2425Это тип объектов блокировки.2627#### `thread.start_new_thread(function, args[, kwargs])`2829Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию *function* со списком аргументов *args* (который должен быть кортежем). Необязательный аргумент *kwargs* задаёт словарь именованных аргументов. Когда функция возвращает управление, поток беззвучно завершается. Когда функция завершается из-за необработанного исключения, печатается трассировка стека, и поток завершается (но остальные потоки продолжают работу).3031#### `thread.interrupt_main()`3233Возбуждает исключение [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt) в главном потоке. Подпоток может использовать эту функцию, чтобы прервать главный поток.3435Новое в версии 2.3.3637#### `thread.exit()`3839Вызывает исключение [`SystemExit`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemExit). Если оно не перехвачено, поток завершится без уведомления.4041#### `thread.allocate_lock()`4243Возвращает новый объект блокировки. Методы блокировок описаны ниже. Изначально блокировка не установлена.4445#### `thread.get_ident()`4647Возвращает «идентификатор потока» текущего потока. Это ненулевое целое число. Его значение не имеет прямого смысла; оно предназначено в качестве «магического ключа» для использования, например, в качестве индекса в словаре данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы после завершения потока и создания другого.4849#### `thread.stack_size([size])`5051Возвращает размер стека потока, используемый при создании новых потоков. Необязательный аргумент *size* задаёт размер стека для последующих создаваемых потоков и должен быть 0 (использовать платформенное или настроенное значение по умолчанию) или положительным целым числом не менее 32 768 (32 КБ). Если *size* не указан, используется 0. Если изменение размера стека потока не поддерживается, возбуждается исключение [`error`](https://python-all.ru/2.7/library/thread.html#thread.error). Если указанный размер стека недействителен, возбуждается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError), а размер стека остаётся неизменным. 32 КБ – текущее минимальное поддерживаемое значение размера стека для гарантии достаточного пространства стека для самого интерпретатора. Обратите внимание, что некоторые платформы могут иметь особые ограничения на значения размера стека, например, требовать минимальный размер стека \> 32 КБ или требовать выделение памяти, кратное размеру страницы системной памяти; для получения дополнительной информации следует обратиться к документации платформы (обычно используются страницы 4 КБ; при отсутствии более конкретной информации рекомендуется использовать значения, кратные 4096, для размера стека). Доступность: Windows, системы с потоками POSIX.5253Новое в версии 2.5.5455Объекты блокировки имеют следующие методы:5657#### `lock.acquire([waitflag])`5859Без необязательного аргумента этот метод захватывает блокировку безусловно, при необходимости ожидая, пока она не будет освобождена другим потоком (только один поток за раз может захватить блокировку – в этом их смысл). Если присутствует целочисленный аргумент *waitflag*, действие зависит от его значения: если он равен нулю, блокировка захватывается только в том случае, если её можно захватить немедленно без ожидания, а если он не равен нулю, блокировка захватывается безусловно, как и раньше. Возвращаемое значение – `True`, если блокировка захвачена успешно, `False` в противном случае.6061#### `lock.release()`6263Освобождает блокировку. Блокировка должна быть захвачена ранее, но не обязательно тем же потоком.6465#### `lock.locked()`6667Возвращает состояние блокировки: `True`, если она захвачена каким-либо потоком, `False` в противном случае.6869В дополнение к этим методам объекты блокировки можно также использовать с помощью оператора [`with`](https://python-all.ru/2.7/reference/compound_stmts.html#with), например:7071```python72import thread7374a_lock = thread.allocate_lock()7576with a_lock:77    print "a_lock is locked while this executes"78```7980**Предостережения:**8182>8384- Потоки странно взаимодействуют с прерываниями: исключение [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt) будет получено произвольным потоком. (Когда модуль [`signal`](https://python-all.ru/2.7/library/signal.html#module-signal) доступен, прерывания всегда направляются в главный поток.)85- Вызов [`sys.exit()`](https://python-all.ru/2.7/library/sys.html#sys.exit) или возбуждение исключения [`SystemExit`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemExit) эквивалентно вызову [`thread.exit()`](https://python-all.ru/2.7/library/thread.html#thread.exit).86- Невозможно прервать метод `acquire()` для блокировки – исключение [`KeyboardInterrupt`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyboardInterrupt) возникнет после того, как блокировка будет захвачена.87- Когда главный поток завершается, переживут ли остальные потоки, определяется системой. На SGI IRIX с использованием собственной реализации потоков они переживают. На большинстве других систем они уничтожаются без выполнения предложений [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) … [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) или выполнения деструкторов объектов.88- При завершении главного потока он не выполняет никакой обычной очистки (за исключением того, что предложения [`try`](https://python-all.ru/2.7/reference/compound_stmts.html#try) … [`finally`](https://python-all.ru/2.7/reference/compound_stmts.html#finally) соблюдаются), и стандартные файлы ввода-вывода не сбрасываются.89