Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
8ab3849
Aiohttp: minor optimisation
Dreamsorcerer May 18, 2025
690f7c6
Create aiohttp-pypy.dockerfile
Dreamsorcerer May 18, 2025
0cbe6e5
Update benchmark_config.json
Dreamsorcerer May 18, 2025
94f3f70
Update config.toml
Dreamsorcerer May 18, 2025
6d05a9a
Update aiohttp-pypy.dockerfile
Dreamsorcerer May 18, 2025
195ee97
Update aiohttp-gunicorn.dockerfile
Dreamsorcerer May 18, 2025
69cf225
Update aiohttp-nginx.dockerfile
Dreamsorcerer May 18, 2025
9df516c
Update aiohttp-orm.dockerfile
Dreamsorcerer May 18, 2025
3d6f056
Update aiohttp.dockerfile
Dreamsorcerer May 18, 2025
084db56
Update requirements.txt
Dreamsorcerer May 18, 2025
6658cc2
Create requirements-cpython.txt
Dreamsorcerer May 18, 2025
31be4e6
Update aiohttp-gunicorn.dockerfile
Dreamsorcerer May 18, 2025
c4b58a4
Update aiohttp-nginx.dockerfile
Dreamsorcerer May 18, 2025
369b3b6
Update aiohttp-orm.dockerfile
Dreamsorcerer May 18, 2025
a08be64
Update aiohttp.dockerfile
Dreamsorcerer May 18, 2025
e829512
Update views.py
Dreamsorcerer May 18, 2025
b44f688
Update aiohttp-nginx.dockerfile
Dreamsorcerer May 18, 2025
f944078
Update aiohttp-orm.dockerfile
Dreamsorcerer May 18, 2025
c55253d
Update aiohttp-pypy.dockerfile
Dreamsorcerer May 18, 2025
0205399
Update aiohttp.dockerfile
Dreamsorcerer May 18, 2025
8e4130f
Update requirements.txt
Dreamsorcerer May 18, 2025
6463d62
Update requirements-cpython.txt
Dreamsorcerer May 18, 2025
535bf1f
Update app.py
Dreamsorcerer May 18, 2025
5b9d99f
Update config.toml
Dreamsorcerer May 18, 2025
d173517
Update main.py
Dreamsorcerer May 18, 2025
9c8f875
Update requirements.txt
Dreamsorcerer May 18, 2025
b3042ee
Update requirements-cpython.txt
Dreamsorcerer May 18, 2025
b1c551f
Update main.py
Dreamsorcerer May 18, 2025
0126ac9
Update server.py
Dreamsorcerer May 18, 2025
080fed1
Update benchmark_config.json
Dreamsorcerer May 19, 2025
8234174
Update aiohttp-gunicorn.dockerfile
Dreamsorcerer May 19, 2025
7f44af6
Update aiohttp-nginx.dockerfile
Dreamsorcerer May 19, 2025
c2a197d
Update aiohttp-orm.dockerfile
Dreamsorcerer May 19, 2025
556f3d7
Update aiohttp-pypy.dockerfile
Dreamsorcerer May 19, 2025
fa69964
Update aiohttp.dockerfile
Dreamsorcerer May 19, 2025
20c8e6f
Update requirements-cpython.txt
Dreamsorcerer May 19, 2025
c90154d
Update aiohttp-gunicorn.dockerfile
Dreamsorcerer May 20, 2025
c47a3e1
Update aiohttp-nginx.dockerfile
Dreamsorcerer May 20, 2025
1c5b359
Update aiohttp-orm.dockerfile
Dreamsorcerer May 20, 2025
62271f8
Update aiohttp-pypy.dockerfile
Dreamsorcerer May 20, 2025
9256786
Update aiohttp.dockerfile
Dreamsorcerer May 20, 2025
1db72b6
Update aiohttp-pypy.dockerfile
Dreamsorcerer May 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions frameworks/Python/aiohttp/aiohttp-gunicorn.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@ ADD ./ /aiohttp

WORKDIR aiohttp

RUN pip3 install cython==3.0.11 gunicorn==23.0.0 && \
pip3 install -r /aiohttp/requirements.txt
RUN pip3 install -r /aiohttp/requirements-cpython.txt

ENV CONNECTION=RAW

EXPOSE 8080

CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py
CMD python3 -O -m gunicorn app.gunicorn:app -c gunicorn_conf.py
9 changes: 3 additions & 6 deletions frameworks/Python/aiohttp/aiohttp-nginx.dockerfile
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
FROM python:3.13

ADD ./requirements.txt /aiohttp/requirements.txt

RUN pip3 install cython==3.0.11 && \
pip3 install -r /aiohttp/requirements.txt

RUN apt-get update && apt-get install -y nginx

ADD ./ /aiohttp

WORKDIR /aiohttp

RUN pip3 install -r /aiohttp/requirements-cpython.txt

ENV CONNECTION=RAW

EXPOSE 8080

RUN chmod +x /aiohttp/nginx-entrypoint.sh

ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"]
ENTRYPOINT ["/aiohttp/nginx-entrypoint.sh"]
9 changes: 3 additions & 6 deletions frameworks/Python/aiohttp/aiohttp-orm.dockerfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
FROM python:3.13

ADD ./requirements.txt /aiohttp/requirements.txt

RUN pip3 install cython==3.0.11 && \
pip3 install -r /aiohttp/requirements.txt

ADD ./ /aiohttp

WORKDIR /aiohttp

RUN pip3 install -r /aiohttp/requirements-cpython.txt

ENV CONNECTION=ORM

EXPOSE 8080

CMD python3 -O -m app.server
CMD python3 -O -m app.server
13 changes: 13 additions & 0 deletions frameworks/Python/aiohttp/aiohttp-pypy.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
FROM pypy:3.11

ADD ./ /aiohttp

WORKDIR /aiohttp

RUN pip3 install -r /aiohttp/requirements.txt

ENV CONNECTION=RAW

EXPOSE 8080

CMD python3 -O -m app.server
9 changes: 3 additions & 6 deletions frameworks/Python/aiohttp/aiohttp.dockerfile
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
FROM python:3.13

ADD ./requirements.txt /aiohttp/requirements.txt

RUN pip3 install cython==3.0.11 && \
pip3 install -r /aiohttp/requirements.txt

ADD ./ /aiohttp

WORKDIR /aiohttp

RUN pip3 install -r /aiohttp/requirements-cpython.txt

ENV CONNECTION=RAW

EXPOSE 8080

CMD python3 -O -m app.server
CMD python3 -O -m app.server
10 changes: 7 additions & 3 deletions frameworks/Python/aiohttp/app/app.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
import uvloop
from aiohttp import web
import argparse
import platform

from aiohttp import web

from .main import create_app


if __name__ == '__main__':
uvloop.install()
if platform.python_implementation() != "PyPy":
import uvloop
uvloop.install()
parser = argparse.ArgumentParser()
parser.add_argument('--socket', type=str, required=True)
args = parser.parse_args()
Expand Down
22 changes: 13 additions & 9 deletions frameworks/Python/aiohttp/app/main.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import multiprocessing
import os
import platform

import asyncpg
from aiohttp import web
from sqlalchemy.engine.url import URL
from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
Expand All @@ -20,6 +20,15 @@
updates_raw,
)

if platform.python_implementation() != "PyPy":
import asyncpg

class NoResetConnection(asyncpg.Connection):
__slots__ = ()

def get_reset_query(self):
return ""

CONNECTION_ORM = os.getenv('CONNECTION', 'ORM').upper() == 'ORM'


Expand All @@ -37,12 +46,6 @@ def pg_dsn(dialect=None) -> str:
)
return url.render_as_string(hide_password=False)

class NoResetConnection(asyncpg.Connection):
__slots__ = ()

def get_reset_query(self):
return ''

async def db_ctx(app: web.Application):
# number of gunicorn workers = multiprocessing.cpu_count() as per gunicorn_conf.py
# max_connections = 2000 as per toolset/setup/linux/databases/postgresql/postgresql.conf:64
Expand Down Expand Up @@ -84,6 +87,7 @@ def setup_routes(app):

def create_app():
app = web.Application()
app.cleanup_ctx.append(db_ctx)
if platform.python_implementation() != "PyPy":
app.cleanup_ctx.append(db_ctx)
setup_routes(app)
return app
12 changes: 8 additions & 4 deletions frameworks/Python/aiohttp/app/server.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import multiprocessing
import os
import platform
import socket
import multiprocessing

from aiohttp import web

from .main import create_app
import uvloop

SERVERS_COUNT = multiprocessing.cpu_count()
BACKLOG = 2048
Expand All @@ -12,7 +14,9 @@
def start_server(sock, cpu_id):
if hasattr(os, "sched_setaffinity"):
os.sched_setaffinity(0, {cpu_id})
uvloop.install()
if platform.python_implementation() != "PyPy":
import uvloop
uvloop.install()
app = create_app()

web.run_app(app, sock=sock, backlog=BACKLOG, access_log=None)
Expand Down Expand Up @@ -43,4 +47,4 @@ def create_reusable_socket(host='0.0.0.0', port=8080):
workers.append(worker)

for worker in workers:
worker.join()
worker.join()
24 changes: 14 additions & 10 deletions frameworks/Python/aiohttp/app/views.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
import platform
from operator import attrgetter, itemgetter
from pathlib import Path
from random import randint, sample

import jinja2
from aiohttp.web import Response
from orjson import dumps
from sqlalchemy import bindparam, select
from sqlalchemy.orm.attributes import flag_modified

from .models import Fortune, World

if platform.python_implementation() == "PyPy":
from aiohttp.web import json_response
else:
from orjson import dumps

def json_response(payload):
return Response(
body=dumps(payload),
content_type="application/json",
)

ADDITIONAL_FORTUNE_ORM = Fortune(id=0, message='Additional fortune added at request time.')
ADDITIONAL_FORTUNE_ROW = {'id': 0, 'message': 'Additional fortune added at request time.'}
READ_ROW_SQL = 'SELECT "randomnumber", "id" FROM "world" WHERE id = $1'
Expand All @@ -25,8 +36,8 @@

def get_num_queries(request):
try:
num_queries = int(request.match_info.get('queries', 1))
except ValueError:
num_queries = int(request.match_info['queries'])
except (KeyError, ValueError):
return 1
if num_queries < 1:
return 1
Expand All @@ -35,13 +46,6 @@ def get_num_queries(request):
return num_queries


def json_response(payload):
return Response(
body=dumps(payload),
content_type="application/json",
)


async def json(request):
"""
Test 1
Expand Down
22 changes: 21 additions & 1 deletion frameworks/Python/aiohttp/benchmark_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,25 @@
"display_name": "aiohttp",
"notes": "uses asyncpg for database access"
},
"pypy": {
"json_url": "/json",
"plaintext_url": "/plaintext",
"port": 8080,
"approach": "Realistic",
"classification": "Micro",
"database": "Postgres",
"framework": "aiohttp",
"language": "Python",
"flavor": "Pypy3",
"orm": "Raw",
"platform": "asyncio",
"webserver": "None",
"os": "Linux",
"database_os": "Linux",
"display_name": "aiohttp-pypy",
"notes": "uses Pypy instead of CPython",
"versus": "default"
},
"nginx": {
"json_url": "/json",
"db_url": "/db",
Expand All @@ -43,7 +62,8 @@
"os": "Linux",
"database_os": "Linux",
"display_name": "aiohttp-nginx",
"notes": "uses nginx as proxy"
"notes": "uses nginx as proxy",
"versus": "default"
},
"gunicorn": {
"json_url": "/json",
Expand Down
13 changes: 13 additions & 0 deletions frameworks/Python/aiohttp/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,19 @@ platform = "asyncio"
webserver = "None"
versus = "None"

[pypy]
urls.plaintext = "/plaintext"
urls.json = "/json"
approach = "Realistic"
classification = "Micro"
database = "Postgres"
database_os = "Linux"
os = "Linux"
orm = "Raw"
platform = "asyncio"
webserver = "None"
versus = "default"

[nginx]
urls.plaintext = "/plaintext"
urls.json = "/json"
Expand Down
6 changes: 6 additions & 0 deletions frameworks/Python/aiohttp/requirements-cpython.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
-r requirements.txt

asyncpg==0.30.0
gunicorn==23.0.0
orjson==3.10.16
uvloop==0.21.0
3 changes: 0 additions & 3 deletions frameworks/Python/aiohttp/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
aiohttp==3.11.18
asyncpg==0.30.0
jinja2==3.1.6
SQLAlchemy==2.0.40
orjson==3.10.16
uvloop==0.21.0
Loading