Skip to main content

A simpler way to handle timeouts in Python

Project description

EggTimer

There are some ubiquitous patterns that are elegant and simple. There are others that are not.

from time import time, sleep

start_time = time()
timeout_sec = 42.0
max_sleep_time_sec = 1.5

while time() - start_time < timeout_sec:
    # Do or check some stuff

    time_remaining = timeout_sec - (time() - start_time)
    if time_remaining > 0:
        sleep(min(time_remaining, max_sleep_time_sec))
    else:
        sleep(max_sleep_time_sec)

What is the purpose of this loop? Oh, I see, it's a timeout. Is the order of operations correct in my loop condition? Have I correctly calculated time_remaining? Is my if clause correct? Hint: it's not. How many times have I duplicated this code within my application?

We can do better. EggTimer can help.

from egg_timer import EggTimer

timer = EggTimer()
timer.set(42.0)
max_sleep_time_sec = 1.5

while not timer.is_expired():
    # Do or check some stuff

    sleep(min(timer.time_remaining_sec, max_sleep_time_sec))

Ah, that's better. Clear, concise, reusable, and expressive. The risk of defects is significantly lower, too!

Installation

Install with pip install -U egg-timer

Documentation

Python 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from egg_timer import EggTimer
>>> help(EggTimer)
Help on class EggTimer in module egg_timer.egg_timer:

class EggTimer(builtins.object)
 |  A class for checking whether or not a certain amount of time has elapsed.
 |
 |  Methods defined here:
 |
 |  __init__(self)
 |      Initialize self.  See help(type(self)) for accurate signature.
 |
 |  is_expired(self)
 |      Check whether or not the timer has expired
 |
 |      :return: True if the elapsed time since set(TIMEOUT_SEC) was called is greater than
 |               TIMEOUT_SEC, False otherwise
 |
 |  reset(self)
 |      Reset the timer without changing the timeout
 |
 |  set(self, timeout_sec: float)
 |      Set a timer
 |
 |      :param timeout_sec: A non-negative floating point number expressing the number of
 |                          seconds to set the timeout for.
 |
 |  ----------------------------------------------------------------------
 |  Readonly properties defined here:
 |
 |  time_remaining_sec
 |      Return the amount of time remaining until the timer expires.
 |
 |      :return: The number of seconds until the timer expires. If the timer is expired, this
 |               function returns 0 (it will never return a negative number).
 |
 |  ----------------------------------------------------------------------
 |  Data descriptors defined here:
 |
 |  __dict__
 |      dictionary for instance variables (if defined)
 |
 |  __weakref__
 |      list of weak references to the object (if defined)

>>>

Running the tests

Running the tests is as simple as poetry install && poetry run pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

egg-timer-1.0.0.post1.tar.gz (16.0 kB view details)

Uploaded Source

Built Distribution

egg_timer-1.0.0.post1-py3-none-any.whl (15.9 kB view details)

Uploaded Python 3

File details

Details for the file egg-timer-1.0.0.post1.tar.gz.

File metadata

  • Download URL: egg-timer-1.0.0.post1.tar.gz
  • Upload date:
  • Size: 16.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.14 CPython/3.10.4 Linux/5.15.0-46-generic

File hashes

Hashes for egg-timer-1.0.0.post1.tar.gz
Algorithm Hash digest
SHA256 12b789c8d17d1aab11c5b994bad336089a4c1ac5e0565e3ad2dd0470eae34939
MD5 f0c54466dfbcffa8d005bc1bb87b7d14
BLAKE2b-256 7d2a898f41d2452ed9b1df66f8abf44364cdf6b364601112c8f7572602a7bb37

See more details on using hashes here.

File details

Details for the file egg_timer-1.0.0.post1-py3-none-any.whl.

File metadata

  • Download URL: egg_timer-1.0.0.post1-py3-none-any.whl
  • Upload date:
  • Size: 15.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.14 CPython/3.10.4 Linux/5.15.0-46-generic

File hashes

Hashes for egg_timer-1.0.0.post1-py3-none-any.whl
Algorithm Hash digest
SHA256 125efb1fdc1582e3354dbbf3218010968a875b97bf7c10e00c8ca6010d9c18ad
MD5 3cef8ce01583d1ff20e890283a52e2b3
BLAKE2b-256 4252370f88c78922a83b6b73d7f6da556737abbae58850f35c247286128a33b0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page