From 39b0297194492d260e25c0d4073fafc288924393 Mon Sep 17 00:00:00 2001 From: Leodanis Pozo Ramos Date: Thu, 14 May 2026 12:12:04 +0000 Subject: [PATCH 1/2] Sample code for: Python sleep(): How to Add Time Delays to Your Code --- python-sleep/README.md | 3 +++ python-sleep/coffee.py | 6 ++++++ python-sleep/download.py | 17 ++++++++++++++++ python-sleep/frozen_app.py | 17 ++++++++++++++++ python-sleep/hello_async.py | 11 +++++++++++ python-sleep/rate_limited.py | 25 +++++++++++++++++++++++ python-sleep/responsive_app.py | 15 ++++++++++++++ python-sleep/sleep_use.py | 10 ++++++++++ python-sleep/thread_monitor.py | 36 ++++++++++++++++++++++++++++++++++ python-sleep/uptime_bot.py | 26 ++++++++++++++++++++++++ python-sleep/utils.py | 20 +++++++++++++++++++ 11 files changed, 186 insertions(+) create mode 100644 python-sleep/README.md create mode 100644 python-sleep/coffee.py create mode 100644 python-sleep/download.py create mode 100644 python-sleep/frozen_app.py create mode 100644 python-sleep/hello_async.py create mode 100644 python-sleep/rate_limited.py create mode 100644 python-sleep/responsive_app.py create mode 100644 python-sleep/sleep_use.py create mode 100644 python-sleep/thread_monitor.py create mode 100644 python-sleep/uptime_bot.py create mode 100644 python-sleep/utils.py diff --git a/python-sleep/README.md b/python-sleep/README.md new file mode 100644 index 0000000000..9ca28166f9 --- /dev/null +++ b/python-sleep/README.md @@ -0,0 +1,3 @@ +# Python sleep(): How to Add Time Delays to Your Code + +This folder provides the code examples for the Real Python tutorial [Python sleep(): How to Add Time Delays to Your Code](https://realpython.com/python-sleep/) diff --git a/python-sleep/coffee.py b/python-sleep/coffee.py new file mode 100644 index 0000000000..7a92bfc8c9 --- /dev/null +++ b/python-sleep/coffee.py @@ -0,0 +1,6 @@ +import time + +print("Brewing coffee...") +print("This would take like 3 secs...") +time.sleep(3) +print("Done! Your coffee is ready!") diff --git a/python-sleep/download.py b/python-sleep/download.py new file mode 100644 index 0000000000..167a0fa0d6 --- /dev/null +++ b/python-sleep/download.py @@ -0,0 +1,17 @@ +import urllib.request +import urllib.error +from utils import retry + + +@retry(delay=3) +def download_file(url): + try: + response = urllib.request.urlopen(url) + print(f"Downloaded {url} ({response.length} bytes)") + except urllib.error.URLError as e: + print(f"Download failed: {e.reason}") + raise + + +if __name__ == "__main__": + download_file("http://www.example.com/data.csv") diff --git a/python-sleep/frozen_app.py b/python-sleep/frozen_app.py new file mode 100644 index 0000000000..36443f7768 --- /dev/null +++ b/python-sleep/frozen_app.py @@ -0,0 +1,17 @@ +import tkinter +import time + +DELAY = 3 # Sleep for 3 seconds + + +def on_click(): + time.sleep(DELAY) + print("Done!") + + +root = tkinter.Tk() +root.geometry("400x400") +button = tkinter.Button(text="Click me!", command=on_click) +button.pack() + +root.mainloop() diff --git a/python-sleep/hello_async.py b/python-sleep/hello_async.py new file mode 100644 index 0000000000..5af6104cbe --- /dev/null +++ b/python-sleep/hello_async.py @@ -0,0 +1,11 @@ +import asyncio + + +async def main(): + print("Hello ...") + await asyncio.sleep(1) + print("... World!") + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python-sleep/rate_limited.py b/python-sleep/rate_limited.py new file mode 100644 index 0000000000..11b009efcf --- /dev/null +++ b/python-sleep/rate_limited.py @@ -0,0 +1,25 @@ +import asyncio +import aiohttp + +RATE_LIMIT_DELAY = 1 # Seconds between API requests + + +async def fetch_page(session, url): + async with session.get(url) as response: + print(f"{url} ({response.status})") + await asyncio.sleep(RATE_LIMIT_DELAY) + + +async def main(): + urls = [ + "https://httpbin.org/get", + "https://httpbin.org/ip", + "https://httpbin.org/headers", + ] + async with aiohttp.ClientSession() as session: + for url in urls: + await fetch_page(session, url) + + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/python-sleep/responsive_app.py b/python-sleep/responsive_app.py new file mode 100644 index 0000000000..607931cfe4 --- /dev/null +++ b/python-sleep/responsive_app.py @@ -0,0 +1,15 @@ +import tkinter + +DELAY = 3000 # The after() method takes milliseconds (3000 ms = 3 seconds) + + +def on_click(): + root.after(DELAY, lambda: print("Done!")) + + +root = tkinter.Tk() +root.geometry("400x400") +button = tkinter.Button(text="Click me!", command=on_click) +button.pack() + +root.mainloop() diff --git a/python-sleep/sleep_use.py b/python-sleep/sleep_use.py new file mode 100644 index 0000000000..0d7e2ede22 --- /dev/null +++ b/python-sleep/sleep_use.py @@ -0,0 +1,10 @@ +import time + +# Sleep for 3 seconds +time.sleep(3) + +# Pass fractional seconds for shorter delays +time.sleep(0.5) # Wait 500 milliseconds +time.sleep(0.001) # Wait 1 millisecond +time.sleep(1.5) # Wait 1.5 seconds +time.sleep(60) # Wait 1 minute diff --git a/python-sleep/thread_monitor.py b/python-sleep/thread_monitor.py new file mode 100644 index 0000000000..16d2d4ad19 --- /dev/null +++ b/python-sleep/thread_monitor.py @@ -0,0 +1,36 @@ +import logging +import threading + +WORKER_INTERVAL = 1 # Seconds between worker check-ins +MAIN_INTERVAL = 0.75 # Seconds between main thread check-ins + + +def worker(event): + while not event.is_set(): + logging.debug("worker thread checking in") + event.wait(WORKER_INTERVAL) + + +def main(): + logging.basicConfig( + level=logging.DEBUG, + format="%(relativeCreated)6d %(threadName)s %(message)s", + ) + event = threading.Event() + + thread = threading.Thread(target=worker, args=(event,)) + thread_two = threading.Thread(target=worker, args=(event,)) + thread.start() + thread_two.start() + + while not event.is_set(): + try: + logging.debug("Checking in from main thread") + event.wait(MAIN_INTERVAL) + except KeyboardInterrupt: + event.set() + break + + +if __name__ == "__main__": + main() diff --git a/python-sleep/uptime_bot.py b/python-sleep/uptime_bot.py new file mode 100644 index 0000000000..6c601e33e1 --- /dev/null +++ b/python-sleep/uptime_bot.py @@ -0,0 +1,26 @@ +import time +import urllib.request +import urllib.error + +CHECK_INTERVAL = 60 # Seconds between checks + + +def uptime_bot(url): + while True: + try: + urllib.request.urlopen(url) + except urllib.error.HTTPError as e: + # Email admin or log + print(f"HTTPError: {e.code} for {url}") + except urllib.error.URLError as e: + # Email admin or log + print(f"URLError: {e.reason} for {url}") + else: + # Website is up + print(f"{url} is up") + time.sleep(CHECK_INTERVAL) + + +if __name__ == "__main__": + url = "https://www.google.com/py" + uptime_bot(url) diff --git a/python-sleep/utils.py b/python-sleep/utils.py new file mode 100644 index 0000000000..b4e11fab65 --- /dev/null +++ b/python-sleep/utils.py @@ -0,0 +1,20 @@ +import time + + +def retry(delay=3, max_retries=3): + def decorator(function): + def wrapper(*args, **kwargs): + attempts = 0 + while attempts < max_retries: + try: + return function(*args, **kwargs) + except Exception: + attempts += 1 + print( + f"Attempt {attempts} failed. Retrying in {delay}s..." + ) + time.sleep(delay) + + return wrapper + + return decorator From 7f85b77a04699f04414fee289cf1219382438ad5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartosz=20Zaczy=C5=84ski?= Date: Thu, 21 May 2026 18:46:19 +0200 Subject: [PATCH 2/2] Final QA --- python-sleep/download.py | 3 ++- python-sleep/frozen_app.py | 2 +- python-sleep/rate_limited.py | 1 + python-sleep/requirements.txt | 9 +++++++++ python-sleep/thread_monitor.py | 11 ++++++----- python-sleep/uptime_bot.py | 2 +- python-sleep/utils.py | 15 ++++++++------- 7 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 python-sleep/requirements.txt diff --git a/python-sleep/download.py b/python-sleep/download.py index 167a0fa0d6..4114816f4f 100644 --- a/python-sleep/download.py +++ b/python-sleep/download.py @@ -1,5 +1,6 @@ -import urllib.request import urllib.error +import urllib.request + from utils import retry diff --git a/python-sleep/frozen_app.py b/python-sleep/frozen_app.py index 36443f7768..b02ca5ab6c 100644 --- a/python-sleep/frozen_app.py +++ b/python-sleep/frozen_app.py @@ -1,5 +1,5 @@ -import tkinter import time +import tkinter DELAY = 3 # Sleep for 3 seconds diff --git a/python-sleep/rate_limited.py b/python-sleep/rate_limited.py index 11b009efcf..4b55f0f061 100644 --- a/python-sleep/rate_limited.py +++ b/python-sleep/rate_limited.py @@ -1,4 +1,5 @@ import asyncio + import aiohttp RATE_LIMIT_DELAY = 1 # Seconds between API requests diff --git a/python-sleep/requirements.txt b/python-sleep/requirements.txt new file mode 100644 index 0000000000..f2df6dc41b --- /dev/null +++ b/python-sleep/requirements.txt @@ -0,0 +1,9 @@ +aiohappyeyeballs==2.6.2 +aiohttp==3.13.5 +aiosignal==1.4.0 +attrs==26.1.0 +frozenlist==1.8.0 +idna==3.15 +multidict==6.7.1 +propcache==0.5.2 +yarl==1.24.2 diff --git a/python-sleep/thread_monitor.py b/python-sleep/thread_monitor.py index 16d2d4ad19..7ae2b64ed3 100644 --- a/python-sleep/thread_monitor.py +++ b/python-sleep/thread_monitor.py @@ -7,25 +7,26 @@ def worker(event): while not event.is_set(): - logging.debug("worker thread checking in") + logging.debug("Worker thread checking in") event.wait(WORKER_INTERVAL) def main(): logging.basicConfig( level=logging.DEBUG, - format="%(relativeCreated)6d %(threadName)s %(message)s", + format="{relativeCreated:>6,.0f} ms | {threadName:<18} | {message}", + style="{", ) event = threading.Event() - thread = threading.Thread(target=worker, args=(event,)) + thread_one = threading.Thread(target=worker, args=(event,)) thread_two = threading.Thread(target=worker, args=(event,)) - thread.start() + thread_one.start() thread_two.start() while not event.is_set(): try: - logging.debug("Checking in from main thread") + logging.debug("Main thread checking in") event.wait(MAIN_INTERVAL) except KeyboardInterrupt: event.set() diff --git a/python-sleep/uptime_bot.py b/python-sleep/uptime_bot.py index 6c601e33e1..55218c3f1d 100644 --- a/python-sleep/uptime_bot.py +++ b/python-sleep/uptime_bot.py @@ -1,6 +1,6 @@ import time -import urllib.request import urllib.error +import urllib.request CHECK_INTERVAL = 60 # Seconds between checks diff --git a/python-sleep/utils.py b/python-sleep/utils.py index b4e11fab65..ddbe42a66c 100644 --- a/python-sleep/utils.py +++ b/python-sleep/utils.py @@ -1,19 +1,20 @@ import time +from functools import wraps def retry(delay=3, max_retries=3): def decorator(function): + @wraps(function) def wrapper(*args, **kwargs): - attempts = 0 - while attempts < max_retries: + last_exc = None + for attempt in range(1, max_retries + 1): try: return function(*args, **kwargs) - except Exception: - attempts += 1 - print( - f"Attempt {attempts} failed. Retrying in {delay}s..." - ) + except Exception as e: + last_exc = e + print(f"Retrying in {delay}s... ({attempt}/{max_retries})") time.sleep(delay) + raise last_exc return wrapper