Задержка в Python: time.sleep, asyncio.sleep и примеры
Как реализовать задержку времени в Python-скрипте: time.sleep для блокирующих пауз, asyncio.sleep для async, примеры throttling, GUI и многопоточности. python sleep, python задержка, пауза python.
Как реализовать задержку времени в Python-скрипте?
В Python задержку времени обычно реализуют через функцию time.sleep — это стандартный способ поставить паузу в скрипте (python sleep, python задержка). Функция принимает число секунд (можно дробное), блокирует текущий поток и подходит для простых задач: паузы между запросами, короткого throttling или ожидания. Для неблокирующих пауз в асинхронном коде используйте asyncio.sleep, а в GUI — платформенные методы (например, root.after в Tkinter).
Содержание
- Базовый метод: time.sleep (python sleep)
- Неблокирующая задержка: asyncio.sleep и async (python asyncio sleep)
- Задержка в миллисекундах и точность (python задержка в миллисекундах)
- GUI, многопоточность и альтернативы (задержка скрипта, пауза python)
- Практические примеры: throttling, таймеры, отложенный вызов
- Частые ошибки и советы (sleep python как работает)
- Источники
- Заключение
Базовый метод: time.sleep (python sleep)
Самый простой и распространённый способ установить задержку — модуль time и функция time.sleep(secs). Аргумент secs задаётся в секундах; можно передавать дробные значения (например, 0.5 — полсекунды). Во время time.sleep выполнение текущего потока приостанавливается — это блокирующая операция.
Пример:
import time
print("Начало")
time.sleep(1.5) # пауза 1.5 секунды
print("Конец")
Короткие, практичные заметки:
time.sleep(0)— уступает квант CPU другим потокам/процессам, полезно для кооперативной многозадачности.- Неверный тип аргумента вызовет
TypeError; отрицательное значение обычно приводит кValueError. - Фактическая длительность паузы может быть длиннее запрошенной из‑за планировщика ОС и нагрузки. Подробнее о поведении и точности см. документацию модуля time.
Неблокирующая задержка: asyncio.sleep и async (python asyncio sleep)
Пишете асинхронное приложение на asyncio? Тогда не используйте time.sleep — он заблокирует весь event loop. Вместо этого применяйте asyncio.sleep, который возвращает корутину и не блокирует другие задачи.
Пример:
import asyncio
async def say_after(delay, msg):
await asyncio.sleep(delay)
print(msg)
async def main():
task1 = asyncio.create_task(say_after(1, "Первое"))
task2 = asyncio.create_task(say_after(2, "Второе"))
await task1
await task2
asyncio.run(main())
Пара советов:
await asyncio.sleep(0)отдаёт управление другим корутинам.- Никогда не вызывайте
time.sleepвнутри корутины — вы остановите весь цикл событий. За примерами и объяснениями альтернатив см. практическое руководство на TimeWeb.
Задержка в миллисекундах и точность (python задержка в миллисекундах)
Как задать паузу в миллисекундах? Просто передайте дробное число в time.sleep, например time.sleep(0.001) — это ~1 мс. Но помните: точность ограничена разрешением таймера ОС и текущей нагрузкой.
Пример измерения фактической паузы:
import time
t0 = time.perf_counter()
time.sleep(0.001) # запрос 1 мс
print(f"Фактическая задержка: {time.perf_counter() - t0:.6f} сек")
Если вам нужна строгая периодичность (микросекунды, жёсткая синхронизация), лучше использовать специализированные решения или аппаратные таймеры — стандартный time.sleep не предназначен для жесткого realtime.
GUI, многопоточность и альтернативы (задержка скрипта, пауза python)
Почему UI зависает, когда вы ставите time.sleep? Потому что GUI обычно работает в главном потоке. Блокировка этого потока «замораживает» интерфейс. Для GUI есть неблокирующие механизмы:
- Tkinter:
root.after(ms, callback)— планирует вызов через заданный интервал (в миллисекундах) и не блокирует UI.
import tkinter as tk
root = tk.Tk()
def on_timer():
print("Таймер сработал")
root.after(1000, on_timer) # через 1000 мс
root.mainloop()
- PyQt/PySide:
QTimer.singleShot(ms, callback)илиQTimerдля периодических вызовов.
Многопоточность:
time.sleepблокирует только тот поток, в котором вызван. В приложениях сthreadingостальные потоки продолжат работу.- Если нужна возможность прервать ожидание, используйте
threading.Event().wait(timeout). Пример прерываемого ожидания:
import threading
stop = threading.Event()
def worker():
while not stop.is_set():
print("Работаю")
# ждём до 2.5 сек или пока событие не будет установлено
if stop.wait(timeout=2.5):
break
t = threading.Thread(target=worker)
t.start()
# остановить:
stop.set()
t.join()
Ещё вариант — threading.Timer, чтобы выполнить функцию через заданное время и при необходимости отменить (cancel()).
Практические примеры: throttling, таймеры, отложенный вызов
- Throttling HTTP-запросов (1 запрос в секунду):
import time
import requests
for _ in range(10):
r = requests.get("https://example.com")
print(r.status_code)
time.sleep(1) # ограничение частоты
- Периодическая задача с коррекцией дрейфа:
import time
interval = 5.0
next_time = time.perf_counter()
while True:
# ваша работа
print("tick")
next_time += interval
sleep_time = next_time - time.perf_counter()
if sleep_time > 0:
time.sleep(sleep_time)
Такой подход поддерживает более ровный интервал, чем просто time.sleep(interval) в конце цикла — он компенсирует время выполнения работы.
- Отложенный вызов в потоке:
from threading import Timer
def say_hi():
print("Привет")
t = Timer(3.0, say_hi) # вызов через 3 секунды
t.start()
# t.cancel() # отмена до срабатывания
Частые ошибки и советы (sleep python как работает)
- Не использовать
time.sleepв главном потоке GUI — интерфейс зависнет. - В async-коде заменить
time.sleepнаawait asyncio.sleep(...). - Не полагаться на микросекундную точность:
time.sleep(0.0001)скорее всего не даст гарантированного результата. - Чтобы прерывать ожидание — применяйте
threading.Event().wait(timeout)или таймеры, а не длинныеtime.sleep. - Для измерений и таймингов используйте
time.perf_counter()/time.monotonic()вместоtime.time(). - Если нужно регулярно выполнять задачу — используйте подход с коррекцией следующего времени (пример выше), scheduler-библиотеки или сторонние планировщики для надежности.
- Хотите разобраться глубже? Есть полезные объяснения и примеры на Hexlet Q&A.
Источники
- Что такое функция sleep в Python? — Hexlet Q&A
- time — Time access and conversions (документация Python)
- Python sleep: как установить задержку в выполнении кода — TimeWeb
- Python sleep(): How to Add Time Delays to Your Code — Real Python
Заключение
В большинстве скриптов для задержки используют time.sleep (python sleep): просто, понятно и достаточно для throttle и простых пауз. Но если вы работаете с асинхронным кодом или GUI — выбирайте asyncio.sleep или платформенные неблокирующие механизмы, чтобы не блокировать event loop или интерфейс. Вспомните также про точность и способы прерывания ожидания — иногда лучше применить threading.Event, threading.Timer или специализированный планировщик.