поток — Несколько потоков управления
Примечание
Модуль thread был переименован в _thread в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании ваших исходных текстов в Python 3; однако, следует рассмотреть использование модуля высокого уровня threading вместо него.
Этот модуль предоставляет низкоуровневые примитивы для работы с несколькими потоками (также называемыми легковесными процессами или задачами) — несколькими потоками управления, разделяющими общее пространство данных. Для синхронизации предоставляются простые блокировки (также называемые мьютексами или двоичными семафорами). Модуль threading предоставляет более удобный и высокоуровневый API для многопоточности, построенный на базе этого модуля.
Модуль является необязательным. Он поддерживается в Windows, Linux, SGI IRIX, Solaris 2.x, а также на системах с реализацией POSIX-потоков (также известной как «pthread»). Для систем, не имеющих модуля thread, доступен модуль dummy_thread. Он дублирует интерфейс этого модуля и может быть использован как его замена.
Он определяет следующие константы и функции:
-
exception thread.error -
Выбрасывается при ошибках, связанных с потоками.
-
thread.LockType -
Это тип объектов блокировки.
-
thread.start_new_thread(function, args[, kwargs]) -
Запускает новый поток и возвращает его идентификатор. Поток выполняет функцию function с аргументами args (должен быть кортежем). Необязательный аргумент kwargs задает словарь ключевых аргументов. Когда функция возвращает значение, поток молча завершается. Если функция завершается с необработанным исключением, выводится трассировка стека, а затем поток завершается (но другие потоки продолжают выполняться).
-
thread.interrupt_main() -
Выбрасывает исключение
KeyboardInterruptв главном потоке. Поток-подзадача может использовать эту функцию для прерывания главного потока.Введено в версии 2.3.
-
thread.exit() -
Выбрасывает исключение
SystemExit. Если оно не перехвачено, это приведет к молчаливому завершению потока.
-
thread.allocate_lock() -
Возвращает новый объект блокировки. Методы блокировок описаны ниже. Блокировка изначально не заблокирована.
-
thread.get_ident() -
Возвращает «идентификатор потока» текущего потока. Это целое число, отличное от нуля. Его значение не имеет прямого смысла; оно предназначено как магическая метка, используемая, например, для индексации словаря данных, специфичных для потока. Идентификаторы потоков могут быть повторно использованы при завершении одного потока и создании другого.
-
thread.stack_size([size]) -
Возвращает размер стека потока, используемый при создании новых потоков. Необязательный аргумент size задает размер стека для последующих потоков и должен быть 0 (использование платформенного или конфигурированного значения по умолчанию) или положительным целым числом не менее 32768 (32 КБ). Если size не указан, используется 0. Если изменение размера стека потока не поддерживается, возникает исключение
error. Если указанный размер стека недействителен, возникает исключениеValueError, а размер стека не изменяется. В настоящее время 32 КБ — это минимальный поддерживаемый размер стека, гарантирующий достаточный размер стека для самого интерпретатора. Обратите внимание, что на некоторых платформах могут быть конкретные ограничения на значения размера стека, такие как требование минимального размера стека > 32 КБ или требование выделения кратно размеру страницы системной памяти — для получения дополнительной информации следует обратиться к документации платформы (4 КБ являются распространенными; использование кратных 4096 для размера стека является рекомендуемым подходом в отсутствие более конкретной информации). Доступность: Windows, системы с POSIX-потоками.Введено в версии 2.5.
Объекты блокировки имеют следующие методы:
-
lock.acquire([waitflag]) -
Без необязательного аргумента этот метод безусловно получает блокировку, если это необходимо, ожидая, пока она не будет освобождена другим потоком (только один поток за раз может получить блокировку — именно для этого они существуют). Если присутствует целочисленный аргумент waitflag, действие зависит от его значения: если оно равно нулю, блокировка приобретается только в том случае, если она может быть получена немедленно без ожидания, а если оно не равно нулю, блокировка приобретается безусловно, как и прежде. Возвращаемое значение равно
Trueесли блокировка успешно получена,Falseесли нет.
-
lock.release() -
Освобождает блокировку. Блокировка должна была быть приобретена ранее, но не обязательно тем же потоком.
-
lock.locked() -
Возвращает состояние блокировки:
Trueесли она была приобретена каким-то потоком,Falseесли нет.
В дополнение к этим методам, объекты блокировки также могут использоваться с помощью оператора with, например:
import thread
a_lock = thread.allocate_lock()
with a_lock:
print "a_lock is locked while this executes"
Примечания:
- Потоки взаимодействуют необычным образом с прерываниями: исключение
KeyboardInterruptбудет получено произвольным потоком. (Когда модульsignalдоступен, прерывания всегда поступают в основной поток.) - Вызов
sys.exit()или возбуждение исключенияSystemExitэквивалентно вызовуthread.exit(). - Невозможно прервать метод
acquire()на блокировке — исключениеKeyboardInterruptпроизойдет после получения блокировки. - При завершении главного потока, определяется системой, выживают ли другие потоки. В SGI IRIX с использованием реализации native потоков, они выживают. На большинстве других систем они уничтожаются без выполнения блоков
try…finallyили выполнения деструкторов объектов. - При завершении главного потока, он не выполняет свою обычную очистку (за исключением того, что блоки
try…finallyвыполняются), и стандартные файлы ввода/вывода не очищаются.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/thread.html