Python - Поточная обработка и некоторое время истинный цикл

'=' является оператором присваивания и будет использоваться для присвоения значений переменным.

$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

10
задан Ian 30 April 2009 в 19:57
поделиться

5 ответов

Ваши потоки добавляются к 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.

11
ответ дан 4 December 2019 в 00:27
поделиться

Использовать семафор; пусть рабочий поток освободит его по завершении, и заблокирует добавляющий поток, пока рабочий не закончит с семафором.

т.е. в работнике сделайте что-то вроде self.done = threading.Semaphore () в начале работы и self.done.release () после завершения. В приведенном выше коде вместо занятого цикла просто выполните self.done.acquire () ; когда рабочий поток завершится, управление вернется.

Редактировать: Боюсь, я не обращаюсь к вашему необходимому значению времени ожидания; эта проблема описывает необходимость тайм-аута семафора в стандартной библиотеке.

1
ответ дан 4 December 2019 в 00:27
поделиться

Используйте 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
0
ответ дан 4 December 2019 в 00:27
поделиться

использовать модуль мьютекса или событие / семафор

0
ответ дан 4 December 2019 в 00:27
поделиться

Здесь вы должны использовать примитив синхронизации. Смотрите здесь: http://docs.python.org/library/threading.html .

Объекты событий кажутся очень простыми и должны решить вашу проблему. Вы также можете использовать объект условия или семафор.

Я не публикую пример, потому что никогда не использовал объекты Event, и альтернативы, вероятно, менее просты.


Редактировать: Я не действительно уверен, что понял вашу проблему. Если поток может ждать, пока не будет выполнено какое-либо условие, используйте синхронизацию. В противном случае решение sleep () , которое кто-то опубликовал, будет занимать слишком много времени процессора.

0
ответ дан 4 December 2019 в 00:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: