Функция time sleep() в Python
В этом уроке мы узнаем о методе time sleep() в python. Функция используется для добавления задержки в выполнении программы. Мы можем использовать функцию sleep(), чтобы остановить выполнение программы на заданное время в секундах. Обратите внимание, что функция ожидания времени фактически останавливает выполнение только текущего потока, а не всей программы.
Синтаксис
sleep() – это метод модуля времени в Python. Итак, сначала мы должны импортировать модуль времени, затем мы можем использовать этот метод. Способ использования функции sleep():

Здесь аргумент метода sleep() t находится в секундах. Это означает, что когда выполняется инструкция time.sleep(t), следующая строка кода будет выполнена через t секунд. Смотрите следующий пример:
# importing time module import time print("Before the sleep statement") time.sleep(5) print("After the sleep statement")
Если вы запустите приведенный выше код, вы увидите, что вторая печать выполняется через 5 секунд. Таким образом, вы можете отложить свой код по мере необходимости.
Аргумент может иметь плавающее значение для более точной задержки. Например, вы хотите сделать задержку на 100 миллисекунд, что составляет 0,1 секунды, как показано ниже:
import time time.sleep(0.100)
Пример
Давайте посмотрим на следующий пример функции sleep в Python.
import time startTime = time.time() for i in range(0,5): print(i) # making delay for 1 second time.sleep(1) endTime = time.time() elapsedTime = endTime - startTime print("Elapsed Time = %s" % elapsedTime)
0 1 2 3 4 Elapsed Time = 5.059988975524902
Прошедшее время больше 5, потому что каждый раз в цикле for выполнение останавливается на 1 секунду. Дополнительное время связано со временем выполнения программы, планированием потоков операционной системы и т.д.
Различное время задержки сна
Иногда может потребоваться задержка на разные секунды. Сделать это можно следующим образом:
import time for i in [ .5, .1, 1, 2]: print("Waiting for %s" % i , end='') print(" seconds") time.sleep(i)
Waiting for 0.5 seconds Waiting for 0.1 seconds Waiting for 1 seconds Waiting for 2 seconds
Эффектная печать с использованием sleep()
Возможно, вам придется напечатать какое-нибудь сообщение необычным образом, вы можете сделать это так:
# importing time module import time message = "Hi. I am trying to create suspense" for i in message: # printing each character of the message print(i) time.sleep(0.3)
Если вы запустите приведенный выше код, вы увидите, что после печати каждого символа сообщения требуется некоторое время, что кажется эффектным.
Метод при многопоточности
Функция time sleep() – очень важный метод для многопоточности. Ниже приведен простой пример, показывающий, что функция ожидания времени останавливает выполнение текущего потока только при многопоточном программировании.
import time from threading import Thread class Worker(Thread): def run(self): for x in range(0, 11): print(x) time.sleep(1) class Waiter(Thread): def run(self): for x in range(100, 103): print(x) time.sleep(5) print("Staring Worker Thread") Worker().start() print("Starting Waiter Thread") Waiter().start() print("Done")
На изображении ниже показан результат, полученный в приведенном выше примере.
Как сделать задержку программы?
Хочу сделать чтобы программа ждала, без time.sleep()
- Вопрос задан более трёх лет назад
- 196 просмотров
Комментировать
Решения вопроса 1
Попробуйте использовать модуль threading и его Timer:
Клик.
from threading import Timer def hello(): print "hello, world" t = Timer(30.0, hello) t.start() # через 30 секунд выведется "hello, world".
Ответ написан более трёх лет назад
Нравится 1 3 комментария

а в чем разница между результатом от вышеприведенного кода и результат time.sleep() ?

Сергей П @trapwalker Куратор тега Python
Hcuy, в том,. что программа продолжает выполняться, но запущен отдельный тред с ожиданием 30сек, после чего выполнится hello
Hcuy, это является таймером. Программа ждёт, когда пройдёт определённое время и выполняет заданные действия. Не думаю, что этот метод останавливает программу.
Ответы на вопрос 1
Сергей Горностаев @sergey-gornostaev Куратор тега Python
Седой и строгий
Модуль, который что-то ждёт.
Ответ написан более трёх лет назад
Нравится 7 1 комментарий

Сергей П @trapwalker Куратор тега Python
NOblo, коллега вам, как бы, намекает, что вы поставили вопрос из рук вон плохо. Это как «хочу сделать трахеотомию, но тыкаю ножиком — кричит. Хочу, чтобы не кричал, какой инструмент использовать?»
Python. Как сделать задержку, не заморозив программу?
При использовании time.sleep(x), вся программа останавливается. Я же делаю бота, в котором после каждого действия нужно ждать. Ты же не можешь работать весь день без остановки? Нет, не можешь. После каждой работы нужно будет отдохнуть 1 реальный час. Но time.sleep(x) останавливает ВСЮ программу, и после каждой работы никто не может пользоватся ботом. Как сделать задержку, без заморозки программы?
Отслеживать
задан 23 сен 2020 в 14:04
TheNick — Ник TheNick — Ник
158 1 1 серебряный знак 17 17 бронзовых знаков
Запоминать время последнего запроса от каждого пользователя и проверять его, например.
23 сен 2020 в 14:13
Объясни понятнее. Если бот должен не работать, а его-то ждать, то какая разница, могут им пользоваться или нет, если пользоваться им все равно нельзя. Ведь нужно отдохнуть реальный час.
23 сен 2020 в 14:14
Надо же, первый раз вижу такую трогательную заботу о том, чтобы бот не переутомился.
23 сен 2020 в 14:21
@strawdog к сожалению, это не для бота 🙁 Мой бот игровой, так сказать «симулятор жизни», и чтобы человек не злоупотреблял и не спамил командой чтобы получить много денег, надо сделать отдых
23 сен 2020 в 14:26
По идее у Вас для каждой команды есть обработчик. В нем можно получить время запроса и при повторе команды вычитать его из текущего. Если итог меньше часа то программа должна дать отказ.
Python sleep(): Как выполнить код с задержкой
Случались ли у вас ситуации, когда приложение Python должно не сразу выполняться? Обычно требуется, чтобы запуск кода происходил как можно в более сжатые сроки. Тем не менее, иногда лучше дать программе немного «отдохнуть». Сегодня мы поговорим о функции sleep() , которая реализует эту возможность.
Что такое функция sleep()
С помощью функции sleep() разработчик может сделать так, чтобы программа выполняла определенную часть кода не сразу, а по прошествии какого-то времени. В каких ситуациях эта функция может быть полезной? Например, если необходимо дождаться, пока будет приложение скачано, загружено либо появится определенный элемент на экране.
Таким образом, функция sleep() многофункциональная, и может использоваться как для того, чтобы подождать определенное время, так и дождаться до появления какого-то события .
Эта функция пригодится тем разработчикам, которые владеют навыками создания приложений на среднем уровне.
Использование time.sleep() для вызова функции sleep()
Если необходимо осуществить отсрочку выполнения кода на определенное время, необходимо воспользоваться функцией sleep() , которая относится к модулю time .
Давайте приведем пример, как можно воспользоваться данной функцией.
import time time.sleep(3) # Сон в 3 секунды
В Python 3.5 и выше принцип работы time.sleep() немного отличается. Даже если сон прерывается сигналом, все равно отсрочка произойдет на указанное количество секунд. Правда, если такой сигнал оповещает об ошибке, то такого случая это не касается .
Вы можете проверить, насколько долго будет длиться сон, с использованием модуля Python timeit .
$ python3 -m timeit -n 3 "import time; time.sleep(3)" 3 loops, best of 3: 3 sec per loop
А такая программа будет выполнять проверку того, упал ли какой-то из сайтов. А чтобы не создавать излишнюю нагрузку, такая проверка будет выполняться с определенной периодичностью. Чтобы выполнить такой анализ, можно воспользоваться системным вызовом sleep() .
import time import urllib.request import urllib.error def uptime_bot(url): while True: try: conn = urllib.request.urlopen(url) except urllib.error.HTTPError as e: # Отправка admin / log print(f'HTTPError: для ') except urllib.error.URLError as e: # Отправка admin / log print(f'URLError: для ') else: # Сайт поднят print(f' поднят') time.sleep(60) if __name__ == '__main__': url = 'http://www.google.com/py' uptime_bot(url)
Здесь происходит создание uptime_bot() , принимающего в качестве аргумента адрес сайта. После этого функцией совершается попытка открыть этот адрес сайта с urllib . Если появляется ошибка типа HTTPError, URLError, приложение осуществляет перехват этого исключения и выводит результат на экран. На практике, с большой вероятностью, придется записать данные об этом исключении и отправить соответствующую информацию администратору.
В случае отсутствия исключений, этот код будет без проблем выполняться. Причем нет разницы, что будет происходить, программа будет уходить в сон ровно на 60 секунд. Это означает, что и приложение будет осуществлять попытку подключиться к сайту каждые 60 секунд.
Обратите внимание, что URL, который в предыдущем фрагменте кода используется, с ошибками. Следовательно, вывод командной строки будет таким (обновляться он, как мы поняли, будет каждые 60 секунд).
Теперь давайте попробуем внести некоторые изменения в этот фрагмент, используя уже тот URL, который будет 100% гарантированно работать. Программа может быть перезапущена. Проверьте, какой получился результат.
sleep() с декораторами – возможен ли совместный вызов?
В ряде ситуаций необходимо функцию, которая была безуспешно выполнена в первый раз, перезапустить. Нередко это надо делать, когда после чрезмерной нагрузки на сервер необходимо осуществить попытку загрузки файла. Обычно никто не желает производить частые вызовы данных с сервера. Следовательно, использование sleep() между запросами – очень хорошая идея.
Помимо этого, функция sleep() может использоваться в тех ситуациях, когда нужно проверить состояние интерфейса в ходе тестирования. От ПК, на каком производится запуск теста, зависит скорость, с которой будет осуществляться загрузка пользовательского интерфейса. Она может происходить как быстрее, так и не так быстро. Таким образом, содержимое, которое будет показываться на мониторе в ходе проверки приложением чего-то также изменяется.
Как решить эту проблему? Например, указать приложению, чтобы оно приостановило работу, а потом выполнить проверку через несколько секунд.
Чтобы добавить системный вызов sleep() в Python, возможно использование декоратора как между прохождением, так и недачей теста.
Давайте рассмотрим такой пример.
import time import urllib.request import urllib.error def sleep(timeout, retry=3): def the_real_decorator(function): def wrapper(*args, **kwargs): retries = 0 while retries < retry: try: value = function(*args, **kwargs) if value is None: return except: print(f'Сон на секунд') time.sleep(timeout) retries += 1 return wrapper return the_real_decorator
sleep() – это декоратор, который принимает значение timeout , а также число раз для повтора retry , что по умолчанию равняется трем. Также внутри функции sleep() есть другая, the_real_decorator() , принимающая декорируемую функцию.
В результате, функцией, которая является самой внутренней, wrapper() , принимаются аргументы, а также ключевые слова, которые передаются декорируемой функции. Здесь все и происходит. С помощью цикла while мы повторно вызываем функцию. При возникновении исключения, происходит вызов time.sleep() , увеличивается счетчик попыток retries и осуществляется попытка запуска функции.
Помимо этого, производится переписывание uptime_bot() для нового декоратора.
@sleep(3) def uptime_bot(url): try: conn = urllib.request.urlopen(url) except urllib.error.HTTPError as e: # Отправка admin / log print(f'HTTPError: для ') # Повторное поднятие ошибки исключения для декоратора raise urllib.error.HTTPError except urllib.error.URLError as e: # Отправка admin / log print(f'URLError: для ') # Повторное поднятие ошибки исключения для декоратора raise urllib.error.URLError else: # Сайт поднят print(f' поднят') if __name__ == '__main__': url = 'http://www.google.com/py' uptime_bot(url)
Здесь осуществляется декорирование uptime_bot() с использованием sleep() . Помимо этого, был удален оригинальный while , а также старый вызов sleep(60) . Декоратор сделал все для этого.
Также мы добавили raise внутри блоков, которые выполняют обработку ошибок. Это необходимо, чтобы декоратор правильно выполнял свои функции. Помимо этого, можно написать такой декоратор, который будет отвечать за ошибки. Тем не менее, в нашем случае лучше оставить его в неизменном виде, поскольку ошибки касаются исключительно urllib . В этом случае набор функций, которые он будет задействовать, будет значительно шире.
Sleep() в потоках
В некоторых случаях может понадобиться использование sleep() для потока. Например, осуществить запуск скрипта миграции для базы данных, в которой хранится огромное число записей. Здесь критически важно не допустить простоя, а также чтобы не было надобности ждать на протяжении большего временного промежутка, чем необходимо для завершения миграции. Для этого можно использовать потоки.
Под потоками подразумевается один из методов, с помощью которого становится возможным обеспечение конкурентности в Python. Пользователь может осуществлять запуск сразу нескольких потоков. Таким образом можно сделать программу более производительной.
Чтобы для клиентов приложение работало идеально по части скорости, каждый из потоков должен функционировать на протяжении небольшого временного отрезка, после чего уходить в сон. Это делается двумя способами:
- Применить time.sleep() , как мы показывали ранее. Ниже приведем фрагмент кода, который демонстрирует то, как это работает.
- Воспользоваться Event.wait() , расположенном в модуле threading .
time.sleep()
import logging import threading import time def worker(arg): while not arg["stop"]: logging.debug("рабочий поток вносится") time.sleep(1) def main(): logging.basicConfig( level=logging.DEBUG, format="%(relativeCreated)6d %(threadName)s %(message)s" ) info = thread = threading.Thread(target=worker, args=(info,)) thread_two = threading.Thread(target=worker, args=(info,)) thread.start() thread_two.start() while True: try: logging.debug("Добавление из главного потока") time.sleep(0.75) except KeyboardInterrupt: info["stop"] = True logging.debug('Остановка') break thread.join() thread_two.join() if __name__ == "__main__": main()
Вот пример кода, демонстрирующего, как используется time.sleep() в threading .
Event.wait()
Преимущество этого метода в его отзывчивости. Вот, как он работает.
import logging import threading def worker(event): while not event.isSet(): logging.debug("рабочий поток вносится") event.wait(1) def main(): logging.basicConfig( level=logging.DEBUG, format="%(relativeCreated)6d %(threadName)s %(message)s" ) event = threading.Event() thread = threading.Thread(target=worker, args=(event,)) thread_two = threading.Thread(target=worker, args=(event,)) thread.start() thread_two.start() while not event.isSet(): try: logging.debug("Добавление из главного потока") event.wait(0.75) except KeyboardInterrupt: event.set() break if __name__ == "__main__": main()