Skip to main content

Tremolo is a stream-oriented, asynchronous, programmable HTTP server written in pure Python. It can also serve as an ASGI server.

Project description

Tremolo

Coverage Quality Gate Status

Tremolo is a stream-oriented, asynchronous, programmable HTTP server written in pure Python. It can also serve as an ASGI server.

Tremolo provides a common routing functionality to some unique features such as download/upload speed limiters, etc. While maintaining its simplicity and performance.

Being built with a stream in mind, Tremolo tends to use yield instead of return in route handlers.

@app.route('/hello')
async def hello_world(**server):
    yield b'Hello '
    yield b'world!'

You can take advantage of this to serve/generate big files efficiently:

@app.route('/my/url/speedtest.bin')
async def my_big_data(**server):
    response = server['response']
    # buffer_size = 16384
    buffer_size = server['context'].options['buffer_size']

    response.set_content_type('application/octet-stream')

    with open('/dev/random', 'rb') as f:
        chunk = True

        while chunk:
            chunk = f.read(buffer_size)
            yield chunk

And other use cases���

Features

Tremolo is only suitable for those who value minimalism and stability over features.

With only 3k lines of code, with no dependencies other than the Python Standard Library, it gives you:

Example

Here is a complete hello world example in case you missed the usual return.

from tremolo import Tremolo

app = Tremolo()

@app.route('/hello')
async def hello_world(**server):
    return 'Hello world!', 'latin-1'


if __name__ == '__main__':
    app.run('0.0.0.0', 8000, debug=True)

Well, latin-1 on the right side is not required. The default is utf-8.

You can save it as hello.py and just run it with python3 hello.py.

Your first hello world page with Tremolo will be at http://localhost:8000/hello.

ASGI Server

Tremolo is an HTTP Server framework. You can build abstractions on top of it, say an ASGI server.

In fact, Tremolo already has ASGI server (plus WebSocket) implementation.

So you can immediately use existing ASGI applications / frameworks, behind Tremolo (ASGI server).

For example, If a minimal ASGI application with the name example.py:

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            (b'content-type', b'text/plain')
        ]
    })

    await send({
        'type': 'http.response.body',
        'body': b'Hello world!'
    })

Then you can run as follows:

python3 -m tremolo --debug --bind 127.0.0.1:8000 example:app

To see more available options:

python3 -m tremolo --help

It's also possible to run the ASGI server programmatically (example with uvloop):

python3 example_uvloop.py

Benchmarking

The first thing to note is that Tremolo is a pure Python server framework.

As a pure Python server framework, it is hard to find a comparison. Because most servers/frameworks today are full of steroids like httptools, uvloop, Rust, etc.

You can try comparing with Uvicorn with the following option (disabling steroids to be fair):

uvicorn --loop asyncio --http h11 --log-level error example:app

vs

python3 -m tremolo --log-level ERROR example:app

You will find that Tremolo is reasonably fast.

However, it should be noted that bottlenecks often occur on the application side. Which means that in real-world usage, throughput reflects more on the application than the server.

Misc.

Tremolo utilizes SO_REUSEPORT (Linux 3.9+) to load balance worker processes.

app.run('0.0.0.0', 8000, worker_num=2)

Tremolo can also listen to multiple ports in case you are using an external load balancer like Nginx / HAProxy.

app.listen(8001)
app.listen(8002)

app.run('0.0.0.0', 8000)

You can even get higher concurrency with PyPy or uvloop:

python3 -m tremolo --loop uvloop --log-level ERROR example:app

See: --loop

Installing

python3 -m pip install --upgrade tremolo

Testing

Just run python3 alltests.py for all tests. Or individual test_*.py in the tests/ folder, for example python3 tests/test_cli.py.

If you also want measurements with coverage:

coverage run alltests.py
coverage combine
coverage report
coverage html # to generate html reports

License

MIT 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

tremolo-0.0.771.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

tremolo-0.0.771-py3-none-any.whl (41.7 kB view details)

Uploaded Python 3

File details

Details for the file tremolo-0.0.771.tar.gz.

File metadata

  • Download URL: tremolo-0.0.771.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for tremolo-0.0.771.tar.gz
Algorithm Hash digest
SHA256 e49a7ecd068ec5fe386ad8ceb286732b9e89469bdc737fe79cd017d9920db70b
MD5 6c1b9f0c92474793f6105f20357d1858
BLAKE2b-256 4ebf7b27a46586492f2492be1b451b105e645fe319e077768f3f1e18127be7ab

See more details on using hashes here.

Provenance

The following attestation bundles were made for tremolo-0.0.771.tar.gz:

Publisher: build_and_release.yml on nggit/tremolo

Attestations:

File details

Details for the file tremolo-0.0.771-py3-none-any.whl.

File metadata

  • Download URL: tremolo-0.0.771-py3-none-any.whl
  • Upload date:
  • Size: 41.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for tremolo-0.0.771-py3-none-any.whl
Algorithm Hash digest
SHA256 33e85986b00aa3c75faffed8857634b50b836aae6f16796b35f61b831b890298
MD5 43d13ca1ad4208be1b9d99601ed7e450
BLAKE2b-256 666572ef488a99bd20e0fe0e8d46deca4fde26903367641e9595bee3b9c3ef33

See more details on using hashes here.

Provenance

The following attestation bundles were made for tremolo-0.0.771-py3-none-any.whl:

Publisher: build_and_release.yml on nggit/tremolo

Attestations:

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