'=' является оператором присваивания и будет использоваться для присвоения значений переменным.
$a = 10;
Это означает сохранение 10 в переменную $ a;
$a = 20;
$b = $a;
Приведенный выше пример означает сначала сохранение 20 в переменную $ a, а затем сохранение переменной $ a в $ б. Так как $ a равен 20 и он присваивается $ b, то автоматически $ b также становится 20.
Давайте дошли до "==". Это оператор равенства. Он используется для проверки, являются ли два значения одинаковыми.
$a = 30;
$b = 30;
if ($a == $b){
// do something if both are equal
}
Сравнение использует "==", проверяя, имеет ли $ a то же значение, что и $ b. Это не так точно, как «===» (также сравнивает тип переменной ), но для большинства случаев достаточно «==».
Также есть несколько других операторов, посмотрите документацию: http://php.net/manual/en/language.operators.comparison.php
Ваши потоки добавляются к self.output здесь, а ваша основная задача их потребляет? Если это так, то это специальная работа для Queue.Queue . Ваш код должен выглядеть примерно так:
import Queue
# Initialise queue as:
queue = Queue.Queue()
Finished = object() # Unique marker the producer will put in the queue when finished
# Consumer:
try:
while True:
next_item = self.queue.get(timeout=15)
if next_item is Finished: break
yield next_item
except Queue.Empty:
print "Timeout exceeded"
Потоки вашего производителя добавляют элементы в очередь с помощью queue.put (item)
[Редактировать] В исходном коде возникает проблема гонки при проверке self.done (например, несколько элементов могут быть добавлены в очередь до того, как установлен флаг, вызывая сбой кода при первом один). Обновлен с предложением из ΤΖΩΤΖΙΟΥ - поток производителя должен вместо этого добавить специальный токен (Завершено) в очередь, чтобы указать, что он завершен.
Примечание: Если у вас есть несколько потоков производителя, вам понадобится более общий подход к обнаружению когда они все закончили. Это можно сделать с помощью одной и той же стратегии - каждый поток завершает маркер, а потребитель завершает работу, когда видит маркеры num_threads.
Использовать семафор; пусть рабочий поток освободит его по завершении, и заблокирует добавляющий поток, пока рабочий не закончит с семафором.
т.е. в работнике сделайте что-то вроде self.done = threading.Semaphore ()
в начале работы и self.done.release ()
после завершения. В приведенном выше коде вместо занятого цикла просто выполните self.done.acquire ()
; когда рабочий поток завершится, управление вернется.
Редактировать: Боюсь, я не обращаюсь к вашему необходимому значению времени ожидания; эта проблема описывает необходимость тайм-аута семафора в стандартной библиотеке.
Используйте time.sleep (секунды), чтобы создать короткую паузу после каждой итерации цикла while, чтобы освободить процессор. Вам придется устанавливать время, в течение которого вы спите во время каждой итерации, исходя из того, насколько важно, чтобы вы быстро поймали задание после его завершения.
Пример:
time.clock()
while True:
if len(self.output):
yield self.output.pop(0)
elif self.done or 15 < time.clock():
if 15 < time.clock():
yield "Maximum Execution Time Exceeded %s seconds" % time.clock()
break
time.sleep(0.01) # sleep for 10 milliseconds
Здесь вы должны использовать примитив синхронизации. Смотрите здесь: http://docs.python.org/library/threading.html .
Объекты событий кажутся очень простыми и должны решить вашу проблему. Вы также можете использовать объект условия или семафор.
Я не публикую пример, потому что никогда не использовал объекты Event, и альтернативы, вероятно, менее просты.
Редактировать: Я не действительно уверен, что понял вашу проблему. Если поток может ждать, пока не будет выполнено какое-либо условие, используйте синхронизацию. В противном случае решение sleep ()
, которое кто-то опубликовал, будет занимать слишком много времени процессора.