Как бы я остановил цикл while через n времени?

как бы я остановил цикл while через 5 минут, если он не достигнет того, чего я хочу достичь.

while true: test = 0 if test == 5: break test = test - 1 

Этот код бросает меня в бесконечный цикл.

6 Solutions collect form web for “Как бы я остановил цикл while через n времени?”

Попробуйте следующее:

 import time timeout = time.time() + 60*5 # 5 minutes from now while True: test = 0 if test == 5 or time.time() > timeout: break test = test - 1 

Вы также можете добавить короткий сон здесь, чтобы этот цикл не зависал CPU (например, time.sleep(1) в начале или конце тела цикла).

Попробуйте этот модуль: http://pypi.python.org/pypi/interruptingcow/

 from interruptingcow import timeout try: with timeout(60*5, exception=RuntimeError): while True: test = 0 if test == 5: break test = test - 1 except RuntimeError: pass 

С уважением

В этом случае вам не нужно использовать while True: loop. Существует гораздо более простой способ непосредственного использования времени:

 import time # timeout variable can be omitted, if you use specific value in the while condition timeout = 300 # [seconds] timeout_start = time.time() while time.time() < timeout_start + timeout: test = 0 if test == 5: break test -= 1 
 import time abort_after = 5 * 60 start = time.time() while True: delta = time.time() - start if delta >= abort_after: break 

На мой взгляд, ответ Петра Крампля является лучшим, но нужно еще многое сказать о природе циклов и о том, как оптимизировать использование системы. Начинающие, которые происходят в этом потоке, могут еще больше смущаться логическими и алгоритмическими ошибками в вопросе и существующих ответах.

Во-первых, давайте посмотрим, что делает ваш код, когда вы его написали:

 while True: test = 0 if test == 5: break test = test - 1 

Если вы говорите while True в контексте цикла, обычно ваше намерение состоит в том, чтобы оставаться в цикле навсегда. Если это не ваше намерение, вы должны рассмотреть другие варианты структуры цикла. Петр Крампл показал вам совершенно разумный способ справиться с этим, что гораздо более ясно для кого-то, кто может читать ваш код. Кроме того, вам будет понятнее несколько месяцев спустя, если вам нужно пересмотреть свой код, чтобы добавить или исправить что-то. Хорошо написанный код является частью вашей документации. Обычно есть несколько способов сделать что-то, но это не делает все способы одинаково действительными во всех контекстах. while true является хорошим примером этого, особенно в этом контексте.

Затем мы рассмотрим алгоритмическую ошибку в вашем исходном коде. Самое первое, что вы делаете в цикле, – это назначить 0 для test . Следующее, что вы делаете, это проверить, является ли значение test 5, что никогда не будет иметь место, если у вас есть несколько потоков, изменяющих одно и то же место в памяти. Threading не подходит для обсуждения, но стоит отметить, что код может технически работать, но даже с несколькими потоками много будет отсутствовать, например семафоры. Во всяком случае, вы будете сидеть в этом цикле навсегда, независимо от того, что дозорный сигнал вызывает бесконечный цикл.

Тест test = test - 1 бесполезен, независимо от того, что он делает, потому что переменная сбрасывается в начале следующей итерации цикла. Даже если вы изменили его на test = 5 , цикл все равно будет бесконечным, потому что значение сбрасывается каждый раз. Если вы переместите оператор инициализации за пределы цикла, то у него, по крайней мере, будет шанс выйти. То, что вы, возможно, предназначили, было примерно так:

 test = 0 while True: test = test - 1 if test == 5: break 

Порядок операторов в цикле зависит от логики вашей программы. Это будет работать в любом порядке, хотя это и главное.

Следующий вопрос – потенциальная и вероятная логическая ошибка, начинающаяся с 0, непрерывное вычитание 1, а затем сравнение с положительным числом. Да, бывают случаи, когда это действительно может быть тем, что вы намереваетесь делать, пока вы понимаете последствия, но это скорее всего не то, что вы намеревались. Более новые версии python не обернутся, когда вы достигнете «нижней» диапазона целого числа, такого как C и других языков. Это позволит вам продолжать вычитать 1 до тех пор, пока вы не заполнили доступную память в вашей системе или, по крайней мере, то, что выделено для вашего процесса. Посмотрите на следующий сценарий и результаты:

 test = 0 while True: test -= 1 if test % 100 == 0: print "Test = %d" % test if test == 5: print "Test = 5" break 

который производит это:

 Test = -100 Test = -200 Test = -300 Test = -400 ... Test = -21559000 Test = -21559100 Test = -21559200 Test = -21559300 ... 

Значение test никогда не будет равно 5, поэтому этот цикл никогда не выйдет.

Чтобы добавить к ответу Петра Крампле, вот версия, которая, вероятно, ближе к тому, что вы на самом деле планировали, помимо выхода из цикла через определенный промежуток времени:

 import time test = 0 timeout = 300 # [seconds] timeout_start = time.time() while time.time() < timeout_start + timeout: if test == 5: break test -= 1 

Он все равно не будет разбиваться на основе значения test , но это вполне допустимый цикл с разумным начальным условием. Дальнейшая проверка границ может помочь вам избежать выполнения очень длинного цикла без каких-либо причин, например, проверить, не превышает ли значение теста значение 5 после записи цикла, что немедленно нарушит цикл.


Следует еще упомянуть еще один ответ. Иногда, когда вы петли, как это, вы можете не захотеть потреблять процессор за все выделенное время. Например, скажите, что вы проверяете значение того, что меняется каждую секунду. Если вы не вводите какую-либо задержку, вы будете использовать каждый доступный цикл ЦП, выделенный для вашего процесса. Это нормально, если это необходимо, но хороший дизайн позволит много программ работать параллельно в вашей системе, не перегружая имеющиеся ресурсы. Простая инструкция сна освободит подавляющее большинство циклов процессора, выделенных вашему процессу, чтобы другие программы могли работать.

Следующий пример не очень полезен, но он демонстрирует концепцию. Предположим, вы хотите печатать что-то каждую секунду. Один из способов сделать это будет следующим:

 import time tCurrent = time.time() while True: if time.time() >= tCurrent + 1: print "Time = %d" % time.time() tCurrent = time.time() 

Результат будет следующим:

 Time = 1498226796 Time = 1498226797 Time = 1498226798 Time = 1498226799 

И использование процессора процессора будет выглядеть так:

введите описание изображения здесь

Это огромный объем использования ЦП для работы в основном без работы. Этот код намного приятнее для остальной части системы:

 import time tCurrent = time.time() while True: time.sleep(0.25) # sleep for 250 milliseconds if time.time() >= tCurrent + 1: print "Time = %d" % time.time() tCurrent = time.time() 

Результат такой же:

 Time = 1498226796 Time = 1498226797 Time = 1498226798 Time = 1498226799 

и использование ЦП – путь, путь ниже:

введите описание изображения здесь

Я хочу поделиться тем, что я использую:

 import time # provide a waiting-time list: lst = [1,2,7,4,5,6,4,3] # set the timeout limit timeLimit = 4 for i in lst: timeCheck = time.time() while True: time.sleep(i) if time.time() <= timeCheck + timeLimit: print ([i,'looks ok']) break else: print ([i,'too long']) break 

Затем вы получите:

 [1, 'looks ok'] [2, 'looks ok'] [7, 'too long'] [4, 'looks ok'] [5, 'too long'] [6, 'too long'] [4, 'looks ok'] [3, 'looks ok'] 
  • Как я могу контролировать, какой дистрибутив Python для пакета установить пакет, когда у меня есть Python 2, Python 3 и Anaconda на моем компьютере?
  • in и index в списке
  • Ошибка загрузки закрытого ключа с помощью OpenSSL.crypto.Error:
  • Почему вызовы функций без аргументов выполняются быстрее?
  • регулярное выражение для заголовка - Python
  • Python 2 Bindings Net-SNMP Ошибка - неопределенный символ: netsnmp-memdup
  • Почему json.dumps (list (np.arange (5))) сбой, тогда как json.dumps (np.arange (5) .tolist ()) работает
  • Intellij Python не импортирует из .pydevproject
  • Python - лучший язык программирования в мире.