Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
47 changes: 0 additions & 47 deletions frameworks/Python/fastapi/app-socketify-asgi.py

This file was deleted.

15 changes: 9 additions & 6 deletions frameworks/Python/fastapi/app.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
import multiprocessing
from contextlib import asynccontextmanager

import asyncpg
try:
import asyncpg
_DB_ALLOWED = True
except ImportError:
_DB_ALLOWED = False

import os
from fastapi import FastAPI, Request
from fastapi.responses import PlainTextResponse

try:
if os.getenv('USE_ORJSON', "0") == "1":
import orjson
from fastapi.responses import ORJSONResponse as JSONResponse
except ImportError:
else:
from fastapi.responses import UJSONResponse as JSONResponse

from fastapi.templating import Jinja2Templates
Expand All @@ -34,8 +39,6 @@ def get_num_queries(queries):
return query_count


connection_pool = None

templates = Jinja2Templates(directory="templates")


Expand All @@ -60,7 +63,7 @@ async def lifespan(app: FastAPI):
await app.state.connection_pool.close()


app = FastAPI(lifespan=lifespan)
app = FastAPI(lifespan=lifespan) if _DB_ALLOWED else FastAPI()


@app.get("/json")
Expand Down
59 changes: 59 additions & 0 deletions frameworks/Python/fastapi/app_server.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/usr/bin/env python
import os
import sys
import fastapi

from app import app

if __name__ == "__main__":
import optparse
import multiprocessing
import logging

parser = optparse.OptionParser("usage: %prog [options]", add_help_option=False)
parser.add_option("-h", "--host", dest="host", default='0.0.0.0', type="string")
parser.add_option("-p", "--port", dest="port", default=8080, type="int")
parser.add_option("-s", "--server", dest="server", default="", type="string")
parser.add_option("-w", "--workers", dest="workers", default=0, type="int")
parser.add_option("-k", "--keepalive", dest="keepalive", default=60, type="int")
parser.add_option("-v", "--verbose", dest="verbose", default=0, type="int")
(opt, args) = parser.parse_args()

_is_travis = os.environ.get('TRAVIS') == 'true'

workers = opt.workers
if workers <= 0:
workers = int(multiprocessing.cpu_count())

if _is_travis:
workers = 2

def run_app():
if opt.server in [ 'si', 'socketify' ]:
import socketify
siapp = socketify.ASGI(app)
siapp.listen(opt.port, lambda config: logging.info(f"Listening on port http://localhost:{opt.port} now\n"))
siapp.run()
return

if opt.server in [ 'fp', 'fastpysgi' ]:
import fastpysgi
fastpysgi.server.loop_timeout = 1
fastpysgi.server.hook_sigint = 1
fastpysgi.server.backlog = 4096
fastpysgi.run(app, host=opt.host, port=opt.port, loglevel=opt.verbose)
return

raise Exception(f'Unknown server name = "{opt.server}"')

def create_fork():
n = os.fork()
# n greater than 0 means parent process
if not n > 0:
run_app()

# fork limiting the cpu count - 1
for i in range(1, workers):
create_fork()

run_app() # run app on the main process too :)
22 changes: 12 additions & 10 deletions frameworks/Python/fastapi/benchmark_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -107,8 +107,10 @@
"notes": "",
"versus": "None"
},
"hypercorn-orjson": {
"nginx": {
"json_url": "/json",
"fortune_url": "/fortunes",
"plaintext_url": "/plaintext",
"db_url": "/db",
"query_url": "/queries?queries=",
"update_url": "/updates?queries=",
Expand All @@ -121,14 +123,14 @@
"flavor": "Python3",
"orm": "Raw",
"platform": "asyncio",
"webserver": "Hypercorn",
"webserver": "nginx",
"os": "Linux",
"database_os": "Linux",
"display_name": "FastAPI-hypercorn-orjson",
"display_name": "FastAPI-gnuicorn-nginx",
"notes": "",
"versus": "None"
},
"nginx": {
"uvicorn": {
"json_url": "/json",
"fortune_url": "/fortunes",
"plaintext_url": "/plaintext",
Expand All @@ -144,14 +146,14 @@
"flavor": "Python3",
"orm": "Raw",
"platform": "asyncio",
"webserver": "nginx",
"webserver": "Uvicorn",
"os": "Linux",
"database_os": "Linux",
"display_name": "FastAPI-gnuicorn-nginx",
"display_name": "FastAPI-uvicorn",
"notes": "",
"versus": "None"
},
"uvicorn": {
"fastpysgi": {
"json_url": "/json",
"fortune_url": "/fortunes",
"plaintext_url": "/plaintext",
Expand All @@ -167,12 +169,12 @@
"flavor": "Python3",
"orm": "Raw",
"platform": "asyncio",
"webserver": "Uvicorn",
"webserver": "FastPySGI",
"os": "Linux",
"database_os": "Linux",
"display_name": "FastAPI-uvicorn",
"display_name": "FastAPI [FastPySGI]",
"notes": "",
"versus": "None"
"versus": "fastapi"
}
}
]
Expand Down
26 changes: 3 additions & 23 deletions frameworks/Python/fastapi/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -78,25 +78,6 @@ platform = "None"
webserver = "Hypercorn"
versus = "None"


[hypercorn-orjson]
urls.plaintext = "/plaintext"
urls.json = "/json"
urls.db = "/db"
urls.query = "/queries?queries="
urls.update = "/updates?queries="
urls.fortune = "/fortunes"
approach = "Realistic"
classification = "Micro"
database = "Postgres"
database_os = "Linux"
os = "Linux"
orm = "Raw"
platform = "None"
webserver = "Hypercorn"
versus = "None"


[nginx]
urls.plaintext = "/plaintext"
urls.json = "/json"
Expand All @@ -114,7 +95,6 @@ platform = "None"
webserver = "nginx"
versus = "None"


[uvicorn]
urls.plaintext = "/plaintext"
urls.json = "/json"
Expand All @@ -132,7 +112,7 @@ platform = "None"
webserver = "uvicorn"
versus = "None"

[uvicorn-orjson]
[fastpysgi]
urls.plaintext = "/plaintext"
urls.json = "/json"
urls.db = "/db"
Expand All @@ -146,5 +126,5 @@ database_os = "Linux"
os = "Linux"
orm = "Raw"
platform = "None"
webserver = "uvicorn"
versus = "None"
webserver = "nginx"
versus = "fastapi"
17 changes: 17 additions & 0 deletions frameworks/Python/fastapi/fastapi-fastpysgi.dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
FROM python:3.14-bookworm

WORKDIR /fastapi

RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

RUN apt-get install -y --no-install-recommends libpq-dev
RUN rm -rf /var/lib/apt/lists/*

COPY . ./

RUN pip install -r requirements-fastpysgi.txt

EXPOSE 8080

CMD python app_server.py -s fastpysgi
6 changes: 2 additions & 4 deletions frameworks/Python/fastapi/fastapi-gunicorn-orm.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@ ENV PATH="/opt/venv/bin:$PATH"

RUN pip3 install cython==3.2.3

COPY requirements.txt requirements-sqlalchemy.txt requirements-gunicorn.txt requirements-uvicorn.txt ./

RUN pip3 install -r requirements.txt -r requirements-sqlalchemy.txt -r requirements-gunicorn.txt -r requirements-uvicorn.txt

COPY . ./

RUN pip3 install -r requirements-sqlalchemy.txt

EXPOSE 8080

ENV CONNECTION=ORM
Expand Down
18 changes: 0 additions & 18 deletions frameworks/Python/fastapi/fastapi-hypercorn-orjson.dockerfile

This file was deleted.

6 changes: 2 additions & 4 deletions frameworks/Python/fastapi/fastapi-hypercorn.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@ ENV PATH="/opt/venv/bin:$PATH"

RUN pip3 install cython==3.2.3

COPY requirements.txt requirements-hypercorn.txt ./

RUN pip3 install -r requirements.txt -r requirements-hypercorn.txt

COPY . ./

RUN pip3 install -r requirements-hypercorn.txt

EXPOSE 8080

CMD hypercorn app:app --bind 0.0.0.0:8080 --workers $(nproc)
11 changes: 6 additions & 5 deletions frameworks/Python/fastapi/fastapi-nginx.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,20 @@ FROM python:3.14

WORKDIR /fastapi

RUN apt update && \
apt install nginx -y
RUN apt update
RUN apt install nginx -y
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

RUN pip3 install cython==3.2.3
COPY requirements.txt requirements-gunicorn.txt requirements-uvicorn.txt ./
RUN pip3 install -r requirements.txt -r requirements-gunicorn.txt -r requirements-uvicorn.txt

COPY . ./

RUN pip3 install -r requirements-gunicorn.txt

ENV PGSSLMODE disable

EXPOSE 8080

RUN chmod +x /fastapi/nginx-entrypoint.sh
ENTRYPOINT ["/fastapi/nginx-entrypoint.sh"]
ENTRYPOINT ["/fastapi/nginx-entrypoint.sh"]
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ WORKDIR /fastapi
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"

COPY requirements-socketify-pypy.txt ./
RUN apt-get update; apt-get install libuv1 -y
RUN pip3 install -r requirements-socketify-pypy.txt

COPY . ./

RUN pip3 install -r requirements-socketify-pypy.txt

EXPOSE 8080

CMD python ./app-socketify-asgi.py
CMD python app_server.py -s socketify
8 changes: 4 additions & 4 deletions frameworks/Python/fastapi/fastapi-socketify-asgi.dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ ENV PATH="/opt/venv/bin:$PATH"
RUN apt-get update; apt-get install libuv1 -y
RUN pip3 install cython==3.2.3

COPY requirements-socketify.txt ./
COPY . ./

RUN pip3 install -r requirements-socketify.txt

COPY . ./

EXPOSE 8080

CMD python ./app-socketify-asgi.py
ENV USE_ORJSON=1

CMD python app_server.py -s socketify
Loading
Loading