Web開発のためのPythonフレームワークのパフォーマンスの再検討

最近、新しいWebサービスのプロジェクトを開始する必要があり、Djangoの最大負荷容量をテストすると同時に、FlaskおよびAIOHTTPと比較することにしました。結果は私には予想外だったので、ここに「そのまま」にしておきます。



次の図は、Djangoフレームワーク バージョン3.1、 Flask 1.1、および AIOHTTP3.7の最も単純なApacheベンチマークの結果を示しています AIOHTTPは「通常の」シングルスレッド非同期モードで実行され、DjangoとFlaskは、使用可能なプロセッサコアの数に等しいスレッド数の同期WSGIサーバーGunicornによって提供されます *2。ASGIはテストに参加しませんでした。



試験条件
PostgreSQL. :



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», .



ローカルマシン(4 CPUコア)でテストを実行した結果:







UPD:コメントに正しく記述されているため、正直に比較するには、Gunicornの背後でAIOHTTPを実行するか、ワーカーの数を1に減らす必要があります。



実際のシングルプロセッサVDSでの同じテスト(pingは約45です) ms):







テスト中、AIOHTTPは1つのCPUコア、FlaskおよびDjangoを100%使用しました-使用可能なすべてのコアを100%使用しました。



結論



実際、非同期アプリケーションとマルチスレッドアプリケーションを比較することは完全に正しいわけではなく、さまざまな問題を解決します。したがって、結果は非常に論理的に見えます。ローカルテストでは、AIOHTTPのリソースは単純に少なく、同じ条件下でパフォーマンスは平準化されています。



しかし、Flaskのささやかな結果を説明するのは難しいので、私はこのフレームワークを「オーバークロック」できませんでした。



All Articles