Например, нам требуется удалить файл через 10 секунд после его создания, но при этом основной поток не должен просто остановиться на 10 секунд с помощью time.sleep().
Допустим, у нас также нет никаких асинхронных очередей задач типа rq или celery.
Самый простой способ это класс threading.Timer.
Это удобный способ выполнить отложенное действие, которое не блокирует основной поток. А так же это пример как писать многопоточный код на базе класса threading.Thread. Всё что делает этот класс, это создаёт отдельный поток, в котором и будет запущена функция ожидания.
from threading import TimerМожно проверить выполнилось ли действие с помощью неблокирующго метода ивента is_set()
import os
filename = '/home/user/data.txt'
t = Timer(10, lambda: os.remove(filename))
t.start()
if t.finished.is_set():или отменить выполнение
# do something
t.cancel()А что будет если процесс интерпретатора завершится ДО завершения таймаута?
Тут у нас два варианта:
🔸 Если поток запущен как Daemon то он завершится вместе с программой, тем самым отменив выполнение колбека.
🔸 В противном случае программа не завершится пока поток не завершится.
По умолчанию режим Daemon отключен, то есть программа в любом случае дождётся исполнения колбека и только потом завершится.
Переключение режима следует делать ДО запуска потока!
t = Timer(...)#tricks
t.setDaemon(True)
t.start()