Skip to main content

Exponential Backoff with Collision Avoidance

This module defines a Python iterator implementing exponential backoff with collision avoidance. See https://en.wikipedia.org/wiki/Exponential_backoff#Collision_avoidance for a complete explanation of the algorithm.

A fixed time slot size is defined and then in each iteration a random number of these times slots is chosen. The wait time is the total amount of time represented by these time slots. In each iteration the number of available time slots increases.

For example, define the time slot size to be two seconds. In the first iteration the number of available slots is 2**1-1=1. The number N of slots is chosen randomly in the integer interval [0, 1], that is, either zero or one. The wait time returned is two seconds multiplied by N.

In the second iteration the number of available slots is 2**2-1=3. The number N of slots is chosen randomly in the integer interval [0, 3], that is, either zero, one, two, or three. The wait time returned is two seconds multiplied by N.

And so on.

Because the number of slots is randomly chosen in [0, N], the wait time returned in each iteration can sometimes go down.

Here is a simple example:

from exponential_backoff_ca import ExponentialBackoff

time_slot_secs = 2.0 # The number of seconds in each time slot.
num_iterations = 10  # The number of iterations.

exp_boff = ExponentialBackoff(time_slot_secs, num_iterations)

for interval in exp_boff:
    print(f"wait seconds is {interval}")

Will output (something like)

wait seconds is 2.0
wait seconds is 6.0
wait seconds is 4.0
wait seconds is 24.0
wait seconds is 0.0
wait seconds is 114.0
wait seconds is 238.0
wait seconds is 184.0
wait seconds is 926.0
wait seconds is 1438.0

You can also access where you are in the iteration using the counter property.

from exponential_backoff_ca import ExponentialBackoff

time_slot_secs = 2.0
num_iterations = 5

exp_boff = ExponentialBackoff(time_slot_secs, num_iterations)

for interval in exp_boff:
    print(f"number of times going through loop: {exp_boff.counter}")

Will output

number of times going through loop: 1
number of times going through loop: 2
number of times going through loop: 3
number of times going through loop: 4
number of times going through loop: 5

To limit the maxiumum number of available slots use the optional max_slots parameter:

from exponential_backoff_ca import ExponentialBackoff

time_slot_secs = 2.0 # The number of seconds in each time slot.
num_iterations = 10  # The number of iterations.
max_slots      = 4   # No more than 4 slots available (so wait time <= 4 * 2.0 seconds)

exp_boff = ExponentialBackoff(time_slot_secs, num_iterations, max_slots=max_slots)

for interval in exp_boff:
    print(f"wait seconds is {interval}")

Will output (something like)

wait seconds is 2.0
wait seconds is 2.0
wait seconds is 8.0
wait seconds is 0.0
wait seconds is 8.0
wait seconds is 8.0
wait seconds is 4.0
wait seconds is 4.0
wait seconds is 0.0
wait seconds is 4.0

You can also limit the wait time returned by passing in the limit_value parameter.

from exponential_backoff_ca import ExponentialBackoff

time_slot_secs = 2.0  # The number of seconds in each time slot.
num_iterations = 10   # The number of iterations.
limit_value    = 13.0 # Never return more than 13.0 seconds.

exp_boff = ExponentialBackoff(time_slot_secs, num_iterations, limit_value=limit_value)

for interval in exp_boff:
    print(f"wait seconds is {interval}")

will output (something like)

wait seconds is 0.0
wait seconds is 4.0
wait seconds is 4.0
wait seconds is 13.0
wait seconds is 0.0
wait seconds is 13.0
wait seconds is 13.0
wait seconds is 6.0
wait seconds is 13.0
wait seconds is 13.0

The exponential backoff object doubles the number of slots each time. However, there may be circumstances where that doubling is too much (or too little). You can adjust how fast the number of available slots increases using the multiplier parameter. Passing in a multiplier value less than 1.0 will raise an exception.

from exponential_backoff_ca import ExponentialBackoff

time_slot_secs = 2.0 # The number of seconds in each time slot.
num_iterations = 10  # The number of iterations.
multiplier     = 1.5 # Increase the number of available slots by 1.5 (takes integer part)

exp_boff = ExponentialBackoff(time_slot_secs, num_iterations, multiplier=multiplier)

for interval in exp_boff:
    print(f"wait seconds is {interval}")

Will output something like

wait seconds is 0.0
wait seconds is 2.0
wait seconds is 0.0
wait seconds is 4.0
wait seconds is 8.0
wait seconds is 6.0
wait seconds is 14.0
wait seconds is 38.0
wait seconds is 30.0
wait seconds is 22.0

To see what the iterator is doing, pass in the debug parameter set to True.

Metadata

Release files for exponential-backoff-ca 2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for exponential-backoff-ca 2.3
File Size Uploaded
exponential_backoff_ca-2.3.tar.gz 3.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for exponential-backoff-ca 2.3
File Interpreter ABI Platform
exponential_backoff_ca-2.3-py3-none-any.whl Python 3 none any Details

Total release size: 7.8 kB

Release files / exponential_backoff_ca-2.3.tar.gz

Download URL exponential_backoff_ca-2.3.tar.gz
Size 3.6 kB
Tags Source
SHA-256 checksum
How to use checksums
be3b4c19a80aa678d41152a7e6ec341f380fa907ae07c6a98a593fefe4ae1f67
BLAKE2b-256 checksum
How to use checksums
d4d07bce7e02f7cfd2de9b073eac3965a658971532e6071a04917e716a531bdb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release files / exponential_backoff_ca-2.3-py3-none-any.whl

Download URL exponential_backoff_ca-2.3-py3-none-any.whl
Size 4.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7117b5bb16378c4ac4625862490eb03bb424411bef734564f8f7613fcd6a5010
BLAKE2b-256 checksum
How to use checksums
92f4b829df399ea7e6119ccfa788ccd0bd3a7c3592c90267bb6e1d463cc1d6df
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/5.0.0 CPython/3.11.8

Release history Release notifications | RSS feed

2.5

2 release files

2.4

2 release files

This release

2.3 This release

2 release files

2.1

2 release files

2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page