Skip to main content

Throttles for Python coroutines.

Project description

aiothrottles

GitHub license PyPI PyPI version Documentation Travis status

aiothrottles synchronization primitives are designed to be extension (along the time) to asyncio synchronization primitives.

aiothrottles has the following basic synchronization primitives:

  • Throttle

Getting started

aiothrottles requires python 3.5+. Install package using pip

pip install aiothrottles

Throttle

Implements a rate limiting for asyncio task. A throttle can be used to guarantee exclusive access to a shared resources and locks access for a given time after releasing.

The preferred way to use a Throttle is an async with statement:

throttle = Throttle('1/s')

# ... later
async with throttle:
    # access shared state

which is equivalent to:

throttle  = Throttle('1/s')

# ... later
await throttle.acquire()
try:
    # access shared state
finally:
    throttle.release()

rates

The allowed call rate is determined by the rate argument. Pass the rate in the format {integer limit}/{unit time} or {limit's numerator}/{limit's denominator}{unit time}. For, example:

  • rates with integer limits
    • 4/s, 5/m, 6/h, 7/d
    • 1/second, 2/minute, 3/hour, 4/day
  • rates with rational limits
    • 1/3s, 12/37m, 1/5h, 8/3d

Examples

decorator

Use of Throttle as decorator for coroutines:

import time
from aiothrottles import throttle  # Throttle alias

@throttle(rate='1/s')
async def foo(n):
    print(n, time.time())

for i in range(5):
    await foo(i)

# 0 1563272100.4413373
# 1 1563272101.4427333
# 2 1563272102.4441307
# 3 1563272103.445542
# 4 1563272104.4468124

awaitable

Use of aiothrottles.Throttle as awaitable object:

import time
from aiothrottles import Throttle

throttle = Throttle(rate='1/s')

async def foo(n):
    print(n, time.time())

for i in range(5):
    await throttle
    await foo(i)

# 0 1563275828.253736
# 1 1563275829.2547996
# 2 1563275830.2562528
# 3 1563275831.257302
# 4 1563275832.2587304

context manager

Use of aiothrottles.Throttle as context:

import time
from aiothrottles import Throttle

throttle = Throttle(rate='1/s')

async def foo(n):
    print(n, time.time())

for i in range(5):
    async with throttle:
        await foo(i)

# 0 1563275898.6722345
# 1 1563275899.673589
# 2 1563275900.6750457
# 3 1563275901.6763387
# 4 1563275902.6777005

License

aiothrottles is released under the BSD 3-Clause License.

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

aiothrottles-0.0.1a1.tar.gz (4.5 kB view hashes)

Uploaded Source

Built Distribution

aiothrottles-0.0.1a1-py3-none-any.whl (5.7 kB view hashes)

Uploaded Python 3

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