?
Анимация
JavaScript
|
Главная Библионтека 22.2. threading - средства высокого уровня организации потоков 323 notify() Пробуждает один поток, ожидающий выполнения условия, если таковой имеется. notifyAll() Пробуждает все потоки, ожидающие выполнения условия. 22.2.3 Семафоры Объекты, возвращаемые функцией Semaphore() имеют такой же набор методов, как и объекты, реализующие блокировку (см. раздел 22.2.1). Семафор управляет внутренним счетчиком, который уменьшается при каждом вызове метода acquire() и увеличивается при каждом вызове метода release() . Начальное значение счетчика определяет аргумент, переданный конструктору Semaphore() . Значение счетчика не может стать меньше нуля: вызов метода acquire() при значении счетчика равным нулю блокирует выполнение до тех пор, пока значение не увеличится, то есть пока другой поток не вызовет метод release() . 22.2.4 События Объекты, возвращаемые функцией Event() реализуют простейший механизм взаимодействия потоков: один поток подает сигнал о возникновении события и один или более потоков ожидают его. Объект-событие имеет внутренний флаг. Если этот флаг является истиной, событие считается наступившим. Изначально (при создании объекта) флаг является ложью. isSet() Возвращает 1 , если событие наступило (внутренний флаг является истиной). set() Устанавливает наступление события (внутренний флаг становится истинным). Все потоки, ожидающие события, пробуждаются. clear() Отменяет наступление события (внутренний флаг становится ложным). wait( [timeout ]) Ожидает наступления события, то есть, если внутренний флаг является ложью, блокирует выполнение потока до тех пор, пока другой поток не вызовет метод set() . Если задан и не равен None аргумент timeout (вещественное число), он указывает максимальное время ожидания в секундах. По умолчанию время ожидания не ограничено. start() Запускает выполнение задачи (метод run() объекта) в отдельном потоке. Этот метод может быть вызван не более одного раза. run() Этот метод представляет задачу, которая должна быть выполнена в отдельном потоке. Вы можете переопределить этот метод в производном классе. Стандартный метод run() вызывает функцию, указанную при инициализации объекта (аргумент с именем target). join ([timeout]) Этот метод приостанавливает работу текущего потока (который вызвал метод) до окончания выполнения потока, к объекту которого метод применяется. Если задан и не равен None аргумент timeout (вещественное число), он указывает макси- 22.2.5 Объекты, представляющие потоки Экземпляры класса Thread представляют действия, выполняемые в отдельном потоке. Существует два способа определить эти действия: передача объекта, поддерживающего вызов, в качестве аргумента с именем target или переопределение метода run() в производных классах. В производных классах не следует переопределять другие методы, за исключением, возможно, конструктора. Если Вы переопределяете конструктор, не забудьте вызвать конструктор дочернего класса (Thread. init ()) до того, как Вы будете что-либо делать с потоком. После создания объекта, представляющего поток, Вы можете запустить его с помощью метода start() . После запуска поток считается активным до тех пор, пока не закончится выполнение метода run() . Каждый поток, реализованный с помощью Thread или производного от него класса имеет имя. Имя может быть задано при инициализации или с помощью метода setName() и извлечено с помощью метода getName() . Поток может "присоединиться" к другому потоку, вызвав метод join() объекта, представляющего этот поток. При этом выполнение потока, вызвавшего метод join() приостанавливается до тех пор, пока не завершится выполнение потока, к объекту которого был применен метод. Поток может быть помечен как фоновый (daemon). Выполнение всей программы будет завершено только после того, как активными останутся только фоновые потоки. Начальное значение наследуется от текущего потока. Этот флаг может быть изменен с помощью метода setDaemon() и извлечен с помощью метода getDaemon(). Существует также объект, соответствующий основному потоку. Основной поток не является фоновым. Возможно также создание объектов, соответствующих "посторонним" потокам, то есть потокам, созданным без помощи модуля threading. Такие объекты имеют ограниченную функциональность. Они всегда считаются активными, фоновыми и к ним нельзя присоединиться с помощью метода join() . 22.3. Queue - синхронизированные очереди 325 мальное время в секундах ожидания завершения работы потока. По умолчанию (и если аргумент timeout равен None) время ожидания не ограничено. К одному потоку можно присоединиться несколько раз. Поток не может присоединиться к самому себе, так как это привело бы к (мертвой) блокировке самого себя. К потоку нельзя присоединиться до того, как он будет запущен. getName () Возвращает имя потока. setName( name) Устанавливает имя потока. Имя потока является строкой, которая может быть использована для его идентификации. Несколько потоков могут иметь одинаковое имя. Начальное имя устанавливается конструктором. isAlive () Возвращает 1 , если поток активен. Поток считается активным с момента вызова метода start() и до завершения выполнения задачи (метода run()). isDaemon () Возвращает значение внутреннего флага, который является истиной, если поток выполняется в фоновом режиме. setDaemon( daemonic) Устанавливает значение внутреннего флага, определяющего, в каком режиме выполняется поток, равным daemonic: если флаг является истиной, поток будет выполняться в фоновом режиме. Этот метод должен вызываться до запуска потока. Начальное значение наследуется от потока, создавшего данный поток. Работа всей программы может быть завершена только после завершения работы всех нефоновых потоков. 22.3 Queue - синхронизированные очереди Модуль Queue определяет класс, реализующий очередь (FIFO), доступ к которой может осуществляться из нескольких потоков. Доступность этого модуля зависит от наличия модуля thread. Queue(maxsize) Создает и возвращает объект-очередь. Аргумент maxsize (целое число) определяет максимальное количество элементов, которое можно поместить в очередь. По умолчанию, а также если maxsize меньше или равен нулю, размер очереди не ограничен. Empty Исключения этого класса генерируются при попытке извлечь из пустой или заблокированной очереди элемент с помощью метода get nowait() (или get() с аргументом block равным нулю). 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 |