?
Анимация
JavaScript
|
Главная Библионтека Модуль threading предоставляет средства высокого уровня для работы с несколькими потоками, реализованные поверх модуля thread. Этот модуль безопасен для импортирования с помощью инструкции from threading import *. activeCount() Возвращает число объектов, представляющих активные потоки. Это значение равно длине списка, возвращаемого функцией enumerate(). Condition ([lock]) Создает и возвращает объект, реализующий условие. Этот объект позволяет одному или нескольким потокам ожидать уведомления от другого потока. Если задан аргумент lock, он должен быть объектом, возвращаемым функцией Lock() или RLock() . Этот объект будет использован для блокировки. По умолчанию создается новый объект с помощью функции RLock() . currentThread() Возвращает объект, соответствующий текущему потоку. Если текущий поток не был создан с помощью модуля threading, возвращаемый объект будет иметь ограниченную функциональность. enumerate() Возвращает список объектов, соответствующих активным потокам, созданным с помощью модуля threading (в том числе и фоновые). Список всегда включает объекты для текущего и основного потока и не включает объекты, соответствующие потокам, которые уже завершили или еще не начали свое выполнение. Event() Создает и возвращает объект, реализующий событие. Этот объект позволяет потоку ожидать наступления (установки в другом потоке) события. Lock() Создает и возвращает объект, реализующий примитивную блокировку. В текущих реализациях является псевдонимом для функции thread.allocate lock(). RLock() Создает и возвращает объект, реализующий блокировку. В отличие от объекта, возвращаемого функцией Lock() , допускает повторный захват в том же потоке. Объект должен быть освобожден тем же потоком ровно столько раз, сколько он был захвачен. Semaphore( [count]) Создает и возвращает объект, реализующий семафор. Семафор может быть захвачен не более count раз (по умолчанию 1 ). При последующих попытках захватить семафор ожидает, пока другой поток не освободит его. 22.2 threading - средства высокого уровня организации потоков 22.2. threading - средства высокого уровня организации потоков 321 Thread( [keyword list ]) Этот класс используется для представления потока. Конструктор воспринимает несколько именованных аргументов (keyword list). Действия, выполняемые при запуске потока, могут быть установлены с помощью аргумента с именем target - должен быть объектом, поддерживающим вызов. Этот объект вызывается из метода run() с позиционными и именованными аргументами, заданными соответственно аргументами с именами args и kwargs (по умолчанию используются пустые кортеж и словарь). Аргумент с именем name указывает имя потока; по умолчанию используется Thread-N, где N - десятичное представление небольшого целого числа. Интерфейсы объектов описаны в следующих разделах. 22.2.1 Объекты, реализующие блокировку Функции Lock() и RLock() возвращают объекты, имеющие одинаковый набор методов: acquire( [waitflag]) При вызове без аргументов захватывает (блокирует) объект, дождавшись, если это необходимо, его освобождения другим потокам (возвращает None). Если задан аргумент waitflag (целое число), поведение функции зависит от его значения: 1 - функция ожидает освобождения объекта другим потокам (так же, как и с опущенным аргументом), 0 (и другие значения) - объект захватывается только, если это может быть сделано немедленно. При наличии аргумента функция возвращает 1 , если захват объекта прошел успешно, в противном случае возвращает 0 . release() Освобождает объект. Объект должен быть захвачен ранее. Если метод применяется к объекту, возвращаемому функцией RLock() , объект должен быть захвачен этим же потоком. В то время как объекты, возвращаемые функцией Lock() , реализуют примитивную блокировку (объект может быть захвачен один раз), для объектов, возвращаемых функцией RLock(), метод acquire() может быть вызван многократно одним потоком - для того, чтобы объект мог быть захвачен другим потоком, необходимо ровно столько же раз вызвать метод release() . 22.2.2 Условия Объекты, возвращаемые функцией Condition() всегда ассоциированы с объектом, реализующим блокировку. Такой объект может быть указан в качестве аргумента при инициализации или, по умолчанию, будет создан конструктором. acquire ([...]) release() Вызывают одноименные методы ассоциированного объекта, реализующего блокировку. wait( [timeout]) Освобождает ассоциированный объект, реализующий блокировку, ожидает, пока другим потоком не будет вызван метод notify() или notifyAll() , и снова захватывает ассоциированный объект. Если задан и не равен None аргумент timeout (вещественное число), он указывает максимальное время ожидания в секундах. По умолчанию время ожидания не ограничено. Если для блокировки используется объект, возвращаемый функцией RLock() , этот метод использует его детали реализации для полного освобождения и восстановления уровня захвата объекта. Объект, представляющий условие, имеет методы acquire() и release(), которые вызывают соответствующие методы ассоциированного объекта, реализующего блокировку. Он также имеет методы wait(), notify() и notifyAll(), которые должны вызываться только после того, как будет вызван метод acquire(). При вызове метода wait() объект-условие освобождает ассоциированный объект и блокирует выполнение до тех пор, пока из другого потока не будет вызван метод notify() или notifyAll() . После пробуждения метод снова захватывает ассоциированный объект. Вы можете указать максимальное время ожидания. Методы notify() и notifyAll() не освобождают ассоциированный объект, реализующий блокировку. Таким образом, поток или потоки, вызвавшие метод wait() , будут пробуждены только после того, как поток, вызвавший notify() или notifyAll() окончательно освободит ассоциированный объект. Приведем простой пример с производством и потреблением объектов. Пусть функция make an item available() производит объект, get an available item() его потребляет и an item is available() возвращает истину, если есть в наличии произведенные (но еще не употребленные) объекты. Тогда следующие фрагменты кода могут быть использованы в потоках производителя и потребителя соответственно: # Производим один объект cv.acquireO make an item available() cv.notifyO cv.releaseO # Потребляем один объект cv.acquireO while not an item is available(): cv.waitO get an available item() cv.releaseO 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 [ 101 ] 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |