semvec/pypi-packages huggingface dataset:
frequency-controller 0.0.6
Setting a limitation for usage frequency. Read more: https://github.com/ClericPy/frequency_controller.
License: MIT License
Requires Python: >=2.7
Keywords: frequency limitation async multi-thread asyncio asynchronous

# frequency_controller [![PyPI](https://img.shields.io/pypi/v/frequency_controller?style=plastic)](https://pypi.org/project/frequency_controller/)[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/clericpy/frequency_controller/Python%20package?style=plastic)](https://github.com/ClericPy/frequency_controller/actions?query=workflow%3A%22Python+package%22)![PyPI - Wheel](https://img.shields.io/pypi/wheel/frequency_controller?style=plastic)![PyPI - Python Version](https://img.shields.io/pypi/pyversions/frequency_controller?style=plastic)![PyPI - Downloads](https://img.shields.io/pypi/dm/frequency_controller?style=plastic)![PyPI - License](https://img.shields.io/pypi/l/frequency_controller?style=plastic)
Limitations of frequency. Code snippets copied from [torequests](https://github.com/ClericPy/torequests).


## Intro

> 1. There are many implementations for frequency-control, the generator way is better than using a Queue
>    1. Queue instances use more memory
>    2. Queue initial process is slower than create a generator
> 2. Python3.8+ required the lock protection for async-generators.
>    1. https://bugs.python.org/issue38559
>    2. But 3.6 / 3.7 don't have this feature
> 3. Using timeit.default_timer for a better accuracy but little performance lost.
>    1. Frequency.TIMER = timeit.default_timer

## Install

> pip install -U frequency_controller

## Quick Start

### 1. Multi-Thread Demo

```python
from frequency_controller import Frequency
from threading import Thread
from time import strftime


def sync_demo():
    # limit to 2 concurrent tasks each 1 second
    frequency = Frequency(2, 1)

    def test():
        with frequency:
            print(strftime('%Y-%m-%d %H:%M:%S'))

    threads = [Thread(target=test) for _ in range(5)]
    for t in threads:
        t.start()


if __name__ == "__main__":
    sync_demo()
    # 2020-02-21 18:35:43
    # 2020-02-21 18:35:43
    # 2020-02-21 18:35:44
    # 2020-02-21 18:35:44
    # 2020-02-21 18:35:45
```

### 2. Coroutine Demo

```python
from asyncio import ensure_future, get_event_loop, wait
from time import strftime

from frequency_controller import AsyncFrequency


async def async_demo():
    frequency = AsyncFrequency(2, 1)

    async def task():
        async with frequency:
            print(strftime('%Y-%m-%d %H:%M:%S'))

    tasks = [ensure_future(task()) for _ in range(5)]
    await wait(tasks)


if __name__ == "__main__":
    # python3.7 use asyncio.run
    get_event_loop().run_until_complete(async_demo())
    # 2020-02-21 18:43:51
    # 2020-02-21 18:43:51
    # 2020-02-21 18:43:52
    # 2020-02-21 18:43:52
    # 2020-02-21 18:43:53
```