Metadata-Version: 2.1
Name: loop-rate-limiters
Version: 0.5.0
Summary: Loop rate limiters.
Keywords: rate,loop,frequency,regulator,limiter
Author-email: Stéphane Caron <stephane.caron@normalesup.org>
Maintainer-email: Stéphane Caron <stephane.caron@normalesup.org>
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Scientific/Engineering :: Mathematics
Project-URL: Changelog, https://github.com/tasts-robots/loop-rate-limiters/blob/master/CHANGELOG.md
Project-URL: Source, https://github.com/tasts-robots/loop-rate-limiters
Project-URL: Tracker, https://github.com/tasts-robots/loop-rate-limiters/issues

# Loop rate limiters

[![Build](https://img.shields.io/github/actions/workflow/status/tasts-robots/loop-rate-limiters/main.yml?branch=main)](https://github.com/tasts-robots/loop-rate-limiters/actions)
[![Coverage](https://coveralls.io/repos/github/tasts-robots/loop-rate-limiters/badge.svg?branch=main)](https://coveralls.io/github/tasts-robots/loop-rate-limiters?branch=main)

Simple loop frequency regulators in Python with an API similar to ``rospy.Rate``:

```python
from loop_rate_limiters import RateLimiter
from time import perf_counter

rate = RateLimiter(frequency=400.0)
while True:
    print(f"Hello from loop at {perf_counter():.3f} s")
    rate.sleep()
```

A similar ``AsyncRateLimiter`` class is available for [asynchronous code](#asynchronous-io).

## Installation

### PyPI

[![PyPI version](https://img.shields.io/pypi/v/loop-rate-limiters)](https://pypi.org/project/loop-rate-limiters/)
[![PyPI downloads](https://static.pepy.tech/badge/loop-rate-limiters)](https://pepy.tech/project/loop-rate-limiters)

```console
$ pip install loop-rate-limiters
```

### Conda

[![Conda version](https://anaconda.org/conda-forge/loop-rate-limiters/badges/version.svg)](https://anaconda.org/conda-forge/loop-rate-limiters)
[![Conda downloads](https://anaconda.org/conda-forge/loop-rate-limiters/badges/downloads.svg)](https://anaconda.org/conda-forge/loop-rate-limiters)

```console
$ conda install loop-rate-limiters -c conda-forge
```

## Asynchronous I/O

The ``AsyncRateLimiter`` class provides a loop frequency limiter for [asyncio](https://docs.python.org/3/library/asyncio.html):

```python
import asyncio
from loop_rate_limiters import AsyncRateLimiter

async def main():
    rate = AsyncRateLimiter(frequency=400.0)
    while True:
        loop_time = asyncio.get_event_loop().time()
        print(f"Hello from loop at {loop_time:.3f} s")
        await rate.sleep()

if __name__ == "__main__":
    asyncio.run(main())
```

