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

Цей підручник навчить вас, як використовувати функцію sleep() із вбудованого модуля часу Python, щоб додати часові затримки до коду.

Коли ви запускаєте просту програму Python, виконання коду відбувається послідовно — один оператор за іншим — без будь-якої затримки. Однак у деяких випадках вам може знадобитися відкласти виконання коду. Функція sleep() із вбудованого модуля часу Python допоможе вам це зробити.

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

Синтаксис Python time.sleep()

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

import time

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

time.sleep(n) 

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

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

▶ Ви також можете імпортувати лише функцію сну з модуля часу:

from time import sleep

Якщо ви використовуєте наведений вище метод для імпорту, ви можете викликати функцію sleep() безпосередньо — без використання time.sleep().

Тепер, коли ви вивчили синтаксис функції Python sleep(), давайте напишемо приклади коду, щоб побачити функцію в дії. Ви можете завантажити сценарії Python, використані в цьому підручнику, з папки python-sleep у цьому сховищі GitHub. 👩🏽‍💻

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

Як перший приклад, давайте використаємо функцію сну, щоб затримати виконання простої програми Python.

  Біль від раннього усиновлення реальний, але він потрібен для прогресу

У наступному фрагменті коду:

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

print("Print now")
time.sleep(5)
print("Print after sleeping for 5 seconds")

Тепер запустіть файл simple_example.py і спостерігайте за результатом:

$ python3 simple_example.py

Додайте різні затримки до кодового блоку

У попередньому прикладі ми ввели фіксовану затримку в 5 секунд між виконанням двох операторів print(). Далі давайте закодуємо ще один приклад, щоб представити різні часи затримки під час циклічного проходження ітерованого.

У цьому прикладі ми хотіли б зробити наступне:

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

Цикл через рядок рядків

Розгляньте рядок, речення. Це рядок, де кожне слово є рядком саме по собі.

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

>>> sentence = "How long will this take?"
>>> for char in sentence:
...     print(char)

# Output (truncated for readability)
H
o
w
.
.
.
t
a
k
e
?

Але це не те, чого ми хочемо. Ми хотіли б прокрутити речення та отримати доступ до кожного слова. Для цього ми можемо викликати метод split() у рядку пропозиції. Це поверне список рядків, отриманих шляхом поділу рядка речення, на всі випадки пропуску.

>>> sentence.split()
['How', 'long', 'will', 'this', 'take?']
>>> for word in sentence.split():
...     print(word)

# Output
How
long
will
this
take?

Цикл через ітеровані елементи з різними затримками

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

  • речення – це рядок, який ми хотіли б прокрутити, щоб отримати доступ до кожного слова.
  • delay_times — це список часів затримки, які ми будемо використовувати як аргумент функції sleep() під час кожного проходу циклу.

Тут ми хотіли б одночасно прокрутити два списки: список delay_times і список рядків, отриманих шляхом поділу рядка пропозиції. Ви можете використовувати функцію zip(), щоб виконати цю паралельну ітерацію.

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

# /python-sleep/delay_times.py
import time

sleep_times = [3,4,1.5,2,0.75]
sentence = "How long will this take?"
for sleep_time,word in zip(sleep_times,sentence.split()):
    print(word)
    time.sleep(sleep_time)

Без функції сну керування негайно перейшло б до наступної ітерації. Оскільки ми ввели затримку, наступний прохід через цикл відбувається лише після завершення операції сну.

  Як перенести дані про активність із програми Health на новий iPhone

Тепер запустіть delay_times.py і спостерігайте за результатом:

$ python3 delay_times.py

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

Таймер зворотного відліку в Python

Як наступний приклад, давайте закодуємо простий таймер зворотного відліку на Python.

Давайте визначимо функцію countDown():

# /python-sleep/countdown.py
import time

def countDown(n):
    for i in range(n,-1,-1):
        if i==0:
            print("Ready to go!")
        else:
             print(i)
             time.sleep(1)

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

  • Функція приймає число n як аргумент і починає відлік до нуля, починаючи з цього числа n.
  • Ми використовуємо time.sleep(1), щоб досягти затримки в одну секунду між підрахунками.
  • Коли лічильник досягає 0, функція друкує «Ready to go!».

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

Далі давайте додамо виклик функції countDown() із 5 як аргументом.

countDown(5)

Тепер запустіть скрипт countdown.py і подивіться на роботу функції countDown!

$ python3 countdown.py

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

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

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

Щоб зрозуміти, як це працює, візьмемо приклад.

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

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

import time

def func1():
    for i in range(5):
        print(f"Running t1, print {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Running t2, print {i}.")
         time.sleep(1)


def func3():
    for i in range(4):
         print(f"Running t3, print {i}.")
         time.sleep(0.5)

У Python ви можете використовувати конструктор Thread() для створення екземпляра об’єкта потоку. Використовуючи синтаксис threading.Thread(target = …, args = …) створює потік, який виконує цільову функцію з аргументом, указаним у кортежі args.

  Створюйте адаптивні веб-сайти за допомогою системи керування вмістом SiteSupra

У цьому прикладі функції func1, func2 і func3 не приймають жодних аргументів. Отже, достатньо вказати лише назву функції як ціль. Потім ми визначаємо об’єкти потоку t1, t2 і t3 з функціями func1, func2 і func3 як цільові, відповідно.

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"Running t1, print {i}.")
        time.sleep(2)

def func2():
    for i  in range(5):
         print(f"Running t2, print {i}.")
         time.sleep(1)

def func3():
    for i in range(4):
         print(f"Running t3, print {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.

Висновок

У цьому посібнику ви дізналися, як використовувати функцію Python sleep() для додавання часових затримок до коду.

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

Тепер ви можете ознайомитися з розширеними можливостями модуля часу. Хочете працювати з датами та часом у Python? Окрім модуля часу, ви можете використовувати функціональні можливості модулів дати, часу та календаря.

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