Як додати затримки до коду

Як використовувати функцію sleep() для введення затримок у Python

У цьому посібнику ви опануєте методи застосування функції sleep() з вбудованого модуля time для додавання пауз у виконанні вашого коду на Python.

Коли ви запускаєте програму Python, її команди виконуються одна за одною, без будь-яких пауз. Проте, в певних ситуаціях може виникнути потреба у затримці виконання коду. Саме тут стане в нагоді функція sleep() з модуля time.

У цій статті ви ознайомитесь із синтаксисом та прикладами застосування sleep(), щоб зрозуміти, як вона працює на практиці. Розпочнімо!

Синтаксис функції time.sleep() у Python

Модуль time, що входить до стандартної бібліотеки Python, надає різноманітні функції для роботи з часом. Першим кроком є імпорт модуля time у ваше середовище:

import time

Оскільки sleep() є частиною модуля time, ви можете використовувати її, дотримуючись такого синтаксису:

time.sleep(n)

Тут n – це кількість секунд, на яку потрібно зупинити виконання програми. Це може бути ціле число або число з плаваючою комою.

Іноді потрібна затримка може складати кілька мілісекунд. У такому випадку, перетворіть тривалість у мілісекундах на секунди і передайте її до функції sleep(). Наприклад, для затримки у 100 мілісекунд потрібно вказати 0.1 секунди: time.sleep(0.1).

Ви також можете імпортувати лише функцію sleep() з модуля time:

from time import sleep

У цьому випадку, ви можете викликати sleep() безпосередньо, не використовуючи time.sleep().

Тепер, коли ви ознайомилися з синтаксисом, перейдемо до прикладів коду.

Затримка виконання коду з sleep()

Розглянемо простий приклад, де sleep() затримує виконання програми.

У коді нижче:

  • Перша команда print() виконується одразу.
  • Потім, за допомогою sleep(), вводиться затримка у 5 секунд.
  • Друга команда print() виконається лише після завершення затримки.
# /python-sleep/simple_example.py
import time

print("Друкую зараз")
time.sleep(5)
print("Друкую після 5 секунд затримки")

Запустіть цей файл та спостерігайте за результатом:

$ python3 simple_example.py

Застосування різних затримок в кодовому блоці

У попередньому прикладі ми ввели фіксовану 5-секундну затримку. Тепер розглянемо приклад із різними затримками в циклі.

Нам потрібно зробити наступне:

  • Розглянути речення, виділити кожне слово та вивести його на екран.
  • Після виведення кожного слова, зробити паузу перед виведенням наступного.

Цикл по рядку рядків

Розглянемо речення. Це рядок, де кожне слово є окремим рядком.

Якщо ми пройдемося по рядку, ми отримаємо кожен символ, як показано нижче:

>>> sentence = "Який час це займе?"
>>> for char in sentence:
...     print(char)

# Вивід (скорочений)
Я
к
и
й
.
.
.
м
е
?

Це не те, що нам потрібно. Нам потрібно пройтися по реченню та отримати доступ до кожного слова. Для цього ми можемо скористатися методом split(). Він повертає список рядків, отриманих шляхом поділу по пробілах.

>>> sentence.split()
['Який', 'час', 'це', 'займе?']
>>> for word in sentence.split():
...     print(word)

# Вивід
Який
час
це
займе?

Цикл з різними затримками

Повернемось до нашого прикладу:

  • sentence – це рядок, який ми хочемо переглянути по словах.
  • delay_times – це список затримок, які ми будемо використовувати при кожному проході циклу.

Ми хочемо одночасно переглянути два списки: delay_times і список слів, отриманий з речення. Для цього використовуємо функцію zip().

Функція zip(list1, list2) повертає ітератор кортежів, де кожен кортеж містить елементи з індексом i з list1 та list2.

# /python-sleep/delay_times.py
import time

sleep_times = [3, 4, 1.5, 2, 0.75]
sentence = "Який час це займе?"
for sleep_time, word in zip(sleep_times, sentence.split()):
    print(word)
    time.sleep(sleep_time)

Без sleep() програма відразу б перейшла до наступної ітерації. Завдяки затримці, наступний прохід циклу відбудеться лише після її завершення.

Запустіть delay_times.py та подивіться на результат:

$ python3 delay_times.py

Слова будуть виведені з різними затримками. Затримка після виведення слова з індексом i у рядку відповідає значенню з індексом i у списку delay_times.

Зворотний відлік часу в Python

Розглянемо приклад простого таймера зворотного відліку.

Визначимо функцію countDown():

# /python-sleep/countdown.py
import time

def countDown(n):
    for i in range(n, -1, -1):
        if i == 0:
            print("Готові до старту!")
        else:
            print(i)
            time.sleep(1)

Розберемо визначення функції countDown():

  • Функція приймає число n як аргумент і починає відлік від цього числа до нуля.
  • Ми використовуємо time.sleep(1) для створення затримки в одну секунду між відліками.
  • Коли лічильник досягає 0, функція виводить “Готові до старту!”.

Для зворотного відліку ми використали функцію range() з від’ємним кроком -1. range(n, -1, -1) допоможе нам переглянути числа в діапазоні n, n-1, n-2 і так далі до нуля. Пам’ятайте, що кінцева точка виключається за замовчуванням при використанні range().

Додамо виклик countDown() з аргументом 5.

countDown(5)

Запустіть скрипт countdown.py:

$ python3 countdown.py

Функція sleep() в багатопоточності

Модуль threading в Python надає засоби для багатопоточності. Python Global Interpreter Lock (GIL) гарантує, що в будь-який момент часу виконується лише один активний потік.

Проте, під час операцій вводу-виводу і очікування, як sleep(), процесор може призупинити виконання поточного потоку і переключитися на інший.

Розглянемо приклад.

Створення і запуск потоків в Python

Розглянемо функції func1(), func2() та func3(). Вони проходять по діапазону чисел і виводять їх. Потім слідує затримка sleep(). Ми використали різні затримки, щоб краще зрозуміти переключення між потоками.

import time
import threading

def func1():
    for i in range(5):
        print(f"Виконується t1, друкую {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
        print(f"Виконується t2, друкую {i}.")
        time.sleep(1)

def func3():
    for i in range(4):
        print(f"Виконується t3, друкую {i}.")
        time.sleep(0.5)

Для створення об’єкта потоку в Python використовується конструктор Thread(). Використання синтаксису threading.Thread(target = ..., args = ...) створює потік, який виконує цільову функцію з аргументами. У цьому випадку, функції func1, func2, func3 не приймають жодних аргументів, тому достатньо вказати лише назву функції як ціль. Потім створюємо об’єкти потоку t1, t2 і t3.

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t3 = threading.Thread(target=func3)

t1.start()
t2.start()
t3.start()

Повний код для прикладу потоків:

# /python-sleep/threads.py
import time
import threading

def func1():
    for i in range(5):
        print(f"Виконується t1, друкую {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Виконується t2, друкую {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
        print(f"Виконується t3, друкую {i}.")
        time.sleep(0.5)

t1 = threading.Thread(target=func1)
t2 = threading.Thread(target=func2)
t3 = threading.Thread(target=func3)

t1.start()
t2.start()
t3.start()

Виконання перемикається між трьома потоками. Потік t3 має найменшу затримку, тому призупиняється на короткий час. Потік t1 має найдовшу затримку – дві секунди, і завершує виконання останнім.

Для глибшого розуміння, прочитайте посібник з основ багатопоточності в Python.

Висновок

У цьому посібнику ви навчилися застосовувати функцію sleep() для введення затримок у виконання коду.
Ви можете викликати функцію sleep() з вбудованого модуля time, використовуючи синтаксис time.sleep(). Щоб призупинити виконання на n секунд, використовуйте time.sleep(n). Ви також розглянули приклади затримки ітерацій циклу, зворотного відліку і роботи з багатопоточністю.

Тепер ви можете глибше ознайомитися з можливостями модуля time. Бажаєте працювати з датами і часом в Python? Окрім модуля time, ви можете використовувати модулі datetime та calendar.

Далі ви навчитесь обчислювати різницю в часі в Python. ⏰