TimeoutWatch API

Overview

TimeoutWatch is a lightweight time-tracking class that records a start time on creation and computes remaining time on demand. It is used internally by TimeoutSampler and can be used independently in custom polling or orchestration workflows.

Import

from timeout_sampler import TimeoutWatch

Class: TimeoutWatch

class TimeoutWatch(timeout: float) -> None

A time counter that determines the time remaining since the start of a given interval. The clock starts immediately upon construction.


Constructor

TimeoutWatch(timeout: float)

Creates a new TimeoutWatch instance. Records the current time as the start time and stores the specified timeout duration.

Parameters

Name Type Default Description
timeout float Duration of the interval in seconds to track.

Attributes Set

Attribute Type Description
timeout float The timeout duration passed to the constructor.
start_time float The wall-clock time (time.time()) captured at creation.

Example

from timeout_sampler import TimeoutWatch

watch = TimeoutWatch(timeout=30)
print(watch.timeout)      # 30
print(watch.start_time)   # e.g. 1750600000.123456

Method: remaining_time

remaining_time() -> int | float

Returns the number of seconds remaining in the timeout interval, calculated as:

max(0, start_time + timeout - current_time)

The return value never goes below 0.

Parameters

None.

Return Value

Type Description
int \| float Seconds remaining. Returns 0 (or 0.0) once the timeout has elapsed.

Example

import time
from timeout_sampler import TimeoutWatch

watch = TimeoutWatch(timeout=5)

time.sleep(2)
print(watch.remaining_time())  # ≈ 3.0

time.sleep(4)
print(watch.remaining_time())  # 0

Use in a Custom Polling Loop

import time
from timeout_sampler import TimeoutWatch

watch = TimeoutWatch(timeout=10)

while watch.remaining_time() > 0:
    result = check_some_condition()
    if result:
        break
    time.sleep(1)
else:
    raise RuntimeError("Condition not met within 10 seconds")

Note: remaining_time() is guaranteed to return 0 (never a negative value) once the timeout has elapsed. You can safely use > 0 as the loop condition.


Relationship to TimeoutSampler

TimeoutSampler creates a TimeoutWatch internally to manage its iteration deadline. If you need a polling loop with built-in exception handling and logging, use TimeoutSampler instead. Use TimeoutWatch directly when you need manual control over the polling logic.

For a usage-oriented walkthrough, see Tracking Elapsed Time with TimeoutWatch.


Computing Elapsed Time

TimeoutWatch does not provide a dedicated elapsed-time method. Compute it by subtracting the remaining time from the original timeout:

from timeout_sampler import TimeoutWatch

watch = TimeoutWatch(timeout=30)

# ... some work ...

elapsed = watch.timeout - watch.remaining_time()
print(f"Elapsed: {elapsed:.2f}s")

Tip: This is the same pattern TimeoutSampler uses internally to populate the elapsed_time attribute on TimeoutExpiredError.