Пропустить до содержимого

Как использовать wait в Python?

[

Python sleep(): Как добавить задержки времени в ваш код

by Mike Driscoll intermediate


Введение

Вам когда-нибудь потребовалось заставить вашу программу на Python ждать какое-то время? Большую часть времени вы захотите, чтобы ваш код выполнялся как можно быстрее. Но есть моменты, когда позволить вашему коду “поспать” на некоторое время фактически в вашем интересе.

Например, вы можете использовать вызов Python sleep() для имитации задержки в вашей программе. Возможно, вам нужно подождать загрузки или скачивания файла, или пока графика не загрузится или не будет нарисована на экране. Возможно, вам даже нужно сделать паузу между вызовами веб-API, или между запросами к базе данных. Добавление вызовов Python sleep() в вашу программу может помочь в каждом из этих случаев, и во многих других!

В этом руководстве вы узнаете, как добавлять вызовы Python sleep() с помощью:

  • time.sleep()
  • Декораторов
  • Потоков
  • Async IO
  • Графических интерфейсов пользователя (GUI)

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

Бесплатный бонус: Получите наш бесплатный руководство “The Power of Python Decorators”, которое показывает вам три продвинутых модели и техники декораторов, которые вы можете использовать для написания более понятного и более Pythonic кода.

Добавление вызова Python sleep() с использованием time.sleep()

Вот пример использования time.sleep():

import time
time.sleep(3) # Пауза на 3 секунды

Если вы запустите этот код в консоли, то должны испытать задержку перед тем, как сможете ввести новую команду.

Примечание: В Python 3.5 разработчики ядра немного изменили поведение time.sleep(). Новый вызов Python sleep() продлится не менее указанного числа секунд, даже если сон будет прерван сигналом. Это не применяется, если сам сигнал вызывает исключение.

Вы можете протестировать, сколько длится сон, используя модуль timeit в Python:

Terminal window
$ python3 -m timeit -n 3 "import time; time.sleep(3)"
3 loops, best of 5: 3 sec per loop

Здесь вы запускаете модуль timeit с параметром -n, который говорит timeit, сколько раз выполнить следующую команду. Вы можете видеть, что timeit выполнил команду 3 раза, и лучшее время составило 3 секунды, что ожидалось.

По умолчанию число раз, которое будет запущен ваш код с помощью timeit, равно одному миллиону. Если бы вы запустили вышеуказанный код с параметром -n по умолчанию, то при 3 секундах на итерацию ваш терминал завис бы примерно на 34 дня! У модуля timeit есть несколько других параметров командной строки, которые вы можете изучить в его документации.

Давайте создадим что-то более реалистичное. Системному администратору необходимо знать, когда один из его веб-сайтов перестает работать. Вы хотите иметь возможность регулярно проверять статус кода веб-сайта, но не хотите делать это непрерывно, чтобы не нагружать сервер. Вместо этого вы можете создать программу, которая будет совершать запрос каждые несколько секунд. Python sleep() пригодится в этом случае.

Пример:

import requests
import time
def check_website():
url = "https://www.example.com"
while True:
response = requests.get(url)
if response.status_code == 200:
print(f"Website is up! Status code: {response.status_code}")
else:
print(f"Website is down! Status code: {response.status_code}")
time.sleep(10) # Пауза на 10 секунд

Теперь у вас есть готовая функция, которая будет проверять статус вашего веб-сайта каждые 10 секунд.

Добавление вызова Python sleep() с использованием декораторов

Декораторы в Python предоставляют механизм для изменения поведения функции или класса. Вы можете использовать их для добавления задержки времени к определенной функции, то есть выполнять задежку перед выполнением функции.

Пример:

import time
def sleep_decorator(function):
def wrapper(*args, **kwargs):
time.sleep(2) # Пауза на 2 секунды
return function(*args, **kwargs)
return wrapper
@sleep_decorator
def print_hello():
print("Hello, world!")
print_hello()

В этом примере мы создали декоратор sleep_decorator, который добавляет паузу в 2 секунды перед выполнением функции, к которой он применен. Мы применили этот декоратор к функции print_hello(), которая выводит “Hello, world!“. Когда мы вызываем print_hello(), мы видим, что перед выводом происходит 2-секундная пауза.

Декораторы предоставляют элегантный способ добавления общих атрибутов или функциональности к существующим функциям или классам. Использование time.sleep() в декораторе позволяет нам добавлять паузу времени к функциям по мере необходимости.

Добавление вызова Python sleep() с использованием потоков

Потоки в Python позволяют выполнить несколько фрагментов кода одновременно. Это особенно полезно, когда нам нужно организовать задачи так, чтобы они выполнялись параллельно или асинхронно. Вызов time.sleep() можно использовать вместе с потоками для ожидания выполнения других задач.

Пример:

import time
import threading
def print_numbers():
for i in range(1, 6):
print(i)
time.sleep(1) # Пауза на 1 секунду
def print_letters():
for letter in "abcde":
print(letter)
time.sleep(1) # Пауза на 1 секунду
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)
thread1.start()
thread2.start()
thread1.join()
thread2.join()

В этом примере мы создаем два потока: thread1, который выводит числа от 1 до 5, и thread2, который выводит буквы от ‘a’ до ‘e’. Каждый поток имеет паузу времени на 1 секунду между выводом элементов. Затем мы запускаем оба потока и дожидаемся их завершения с помощью метода join(). Когда код выполняется, мы видим, что числа и буквы выводятся параллельно, с паузой в 1 секунду между ними.

Использование потоков и вызовов time.sleep() позволяет нам выполнять различные задачи одновременно или асинхронно, что может быть полезно, когда требуется организовать параллельное выполнение задач.

Добавление вызова Python sleep() с использованием Async IO

Async IO - это подход к программированию, который позволяет вам создавать асинхронный и параллельный код в Python. Вызов time.sleep() можно использовать с Async IO для ожидания выполнения задачи или операции.

Пример:

import asyncio
async def hello():
print("Hello")
await asyncio.sleep(2) # Пауза на 2 секунды
print("World")
loop = asyncio.get_event_loop()
loop.run_until_complete(hello())

В этом примере мы создаем асинхронную функцию hello(), которая выводит “Hello”, затем делает паузу на 2 секунды с помощью asyncio.sleep(), и затем выводит “World”. Для запуска этой асинхронной функции мы используем цикл событий asyncio.get_event_loop() и метод run_until_complete() для выполнения функции. При выполнении кода мы видим, что “Hello” выводится немедленно, а “World” выводится после паузы в 2 секунды.

Использование Async IO и вызовов time.sleep() позволяет нам создавать асинхронные программы, в которых можно ожидать выполнения задачи или операции и продолжать другие действия.

Добавление вызова Python sleep() с использованием графических интерфейсов пользователя (GUI)

Если вы разрабатываете программы с графическим пользовательским интерфейсом (GUI), то использование time.sleep() может быть полезно для добавления задержки времени перед выполнением определенных действий.

Пример:

import time
import tkinter as tk
def do_something():
time.sleep(2) # Пауза на 2 секунды
label.config(text="Task completed!")
window = tk.Tk()
label = tk.Label(window, text="Click the button to start the task")
button = tk.Button(window, text="Start", command=do_something)
label.pack()
button.pack()
window.mainloop()

В этом примере мы создаем окно GUI с меткой и кнопкой. При нажатии на кнопку вызывается функция do_something(), внутри которой происходит пауза времени на 2 секунды с помощью time.sleep(), а затем текст метки обновляется на “Задача выполнена!“. Когда мы запускаем программу, мы видим метку с сообщением и кнопку “Start”. При нажатии на кнопку, происходит пауза на 2 секунды и затем текст метки обновляется.

Использование time.sleep() в графических интерфейсах пользователя позволяет добавить задержку времени перед выполнением определенных действий, таких как обновление интерфейса или отображение информации.

Заключение

В этом руководстве мы рассмотрели различные способы добавления вызовов Python sleep() в ваш код. Мы рассмотрели использование time.sleep() для добавления паузы времени, декораторов для добавления паузы времени к функциям, потоков для выполнения задач параллельно, Async IO для асинхронного программирования и вызовов time.sleep() в графических интерфейсах пользователя. Каждый из этих способов имеет свои преимущества и может быть полезен для различных сценариев.

Вызовы Python sleep() особенно полезны, когда вам нужно добавить задержки времени в ваш код, чтобы дать другим задачам или операциям выполняться или подождать завершения некоторых операций. Будь то симуляция задержки, ожидание выполнения файла, запросы к API или ожидание завершения других задач, time.sleep() может быть полезным инструментом в вашем арсенале разработчика.

Надеюсь, что это руководство было полезным и позволит вам легко добавлять задержки времени в ваш код на Python. Успехов вам, и пусть ваш код спит исправно!