Программирование

Задержка в 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)

Самый простой и распространённый способ установить задержку — модуль time и функция time.sleep(secs). Аргумент secs задаётся в секундах; можно передавать дробные значения (например, 0.5 — полсекунды). Во время time.sleep выполнение текущего потока приостанавливается — это блокирующая операция.

Пример:

python
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, который возвращает корутину и не блокирует другие задачи.

Пример:

python
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 мс. Но помните: точность ограничена разрешением таймера ОС и текущей нагрузкой.

Пример измерения фактической паузы:

python
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.
python
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). Пример прерываемого ожидания:
python
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, таймеры, отложенный вызов

  1. Throttling HTTP-запросов (1 запрос в секунду):
python
import time
import requests

for _ in range(10):
 r = requests.get("https://example.com")
 print(r.status_code)
 time.sleep(1) # ограничение частоты
  1. Периодическая задача с коррекцией дрейфа:
python
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) в конце цикла — он компенсирует время выполнения работы.

  1. Отложенный вызов в потоке:
python
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.

Источники


Заключение

В большинстве скриптов для задержки используют time.sleep (python sleep): просто, понятно и достаточно для throttle и простых пауз. Но если вы работаете с асинхронным кодом или GUI — выбирайте asyncio.sleep или платформенные неблокирующие механизмы, чтобы не блокировать event loop или интерфейс. Вспомните также про точность и способы прерывания ожидания — иногда лучше применить threading.Event, threading.Timer или специализированный планировщик.

Авторы
Проверено модерацией
Модерация
Задержка в Python: time.sleep, asyncio.sleep и примеры