Die folgenden Diagramme zeigen die Ergebnisse des einfachsten Apache-Benchmarks für die Django- Frameworks Version 3.1, Flask 1.1 und AIOHTTP 3.7. AIOHTTP wird im "normalen" asynchronen Single-Thread-Modus ausgeführt. Django und Flask werden von einem synchronen WSGI-Server Gunicorn bedient, dessen Anzahl der Threads der Anzahl der verfügbaren Prozessorkerne entspricht. * 2. ASGI hat nicht am Test teilgenommen.
Test-Bedingungen
PostgreSQL. :
, , , .
AIOHTTP asyncpg, Django Flask — SQLAlchemy ORM ( ) psycopg2.
Django (django-admin startproject, manage.py startapp . .), ListView. Flask AIOHTTP «Hello, world», .
SELECT r.id, r.auth_user_id, r.status, r.updated, r.label, r.content, u.username,
ARRAY_AGG(t.tag) tag, COUNT(*) OVER() cnt,
(
SELECT COUNT(*) FROM record r2
WHERE
r2.parent_id IS NOT NULL
AND r2.parent_id = r.id
AND r2.status = 'new'
) AS parts
FROM record r
JOIN auth_user u ON u.id = r.auth_user_id
LEFT JOIN tag t ON t.kind_id = r.id AND t.kind = 'rec'
WHERE r.parent_id IS NULL AND r.status = 'new'
GROUP BY r.id, u.username
ORDER BY r.updated DESC
LIMIT 10 OFFSET 0
, , , .
AIOHTTP asyncpg, Django Flask — SQLAlchemy ORM ( ) psycopg2.
Django (django-admin startproject, manage.py startapp . .), ListView. Flask AIOHTTP «Hello, world», .
Ergebnisse der Ausführung des Tests auf einem lokalen Computer (4 CPU-Kerne):
UPD: Wie in den Kommentaren richtig geschrieben, sollten Sie für einen ehrlichen Vergleich entweder AIOHTTP hinter Gunicorn ausführen oder die Anzahl der Mitarbeiter auf 1 reduzieren.
Der gleiche Test auf einem echten VDS mit einem Prozessor (Ping ist ungefähr 45) ms):
Während des Tests verwendete AIOHTTP 100% eines CPU-Kerns, Flask und Django - 100% aller verfügbaren Kerne.
Schlussfolgerungen
Tatsächlich ist der Vergleich von asynchronen und Multithread-Anwendungen nicht ganz korrekt - sie lösen unterschiedliche Probleme. Daher sieht das Ergebnis ziemlich logisch aus: Im lokalen Test hatte AIOHTTP einfach weniger Ressourcen, unter gleichen Bedingungen wird die Leistung ausgeglichen.
Aber das bescheidene Ergebnis von Flask ist schwer zu erklären, ich konnte diesen Rahmen nicht "übertakten".