Π£ ΠΌΠ΅Π½Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ raspbian
[2018-09-10 20:40:11 +0800] [21421] [ΠΠ ΠΠ’ΠΠ§ΠΠ‘ΠΠΠ] ΠΠ ΠΠΠ― ΠΠ£Π’Π Π ΠΠΠΠ’ΠΠΠΠ (pid: 21699)
[2018-09-10 20:40:11 +0800] [21699] [ERROR] ΠΠ°ΠΏΡΠΎΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΎΠΊΠ΅ΡΠ°.
ΠΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ Π²ΡΠ·ΠΎΠ² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ):
Π€Π°ΠΉΠ» "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", ΡΡΡΠΎΠΊΠ° 62, Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅
six.reraise (* sys.exc_info ())
Π€Π°ΠΉΠ» "/usr/lib/python3/dist-packages/gunicorn/six.py", ΡΡΡΠΎΠΊΠ° 625, ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠ΄Π½ΠΈΠΌΠ°Π΅ΡΡΡ
ΠΏΠΎΠ΄Π½ΡΡΡ ΡΡΠΎΠΈΠΌΠΎΡΡΡ
Π€Π°ΠΉΠ» "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", ΡΡΡΠΎΠΊΠ° 35, Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅
listener_name = listener.getsockname ()
OSError: [Errno 9] ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°.
@ leond08 Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° Π±ΠΈΠ»Π΅Ρ!
ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ?
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ gunicorn3
Π― ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ eventlet ΠΈ gevent Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ
Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ»ΡΠ³ΠΈ - Flask-SocketIO
Π― Π·Π°ΠΏΡΡΠΊΠ°Ρ ΡΠ²ΠΎΡ ΡΠΎΠ½ΠΎΠ²ΡΡ Π·Π°Π΄Π°ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΠΆΠ°Π» ΠΊΠ½ΠΎΠΏΠΊΡ
ΠΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ ΡΠΎΠ½ΠΎΠ²ΠΎΠΉ Π·Π°Π΄Π°ΡΠΈ - ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΠ΅,
ΠΏΠΎΡΠ»Π΅ Π½Π°ΠΆΠ°ΡΠΈΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ Β«ΠΠΠ’ΠΠΠΒ» ΡΠΎΠ½ΠΎΠ²Π°Ρ Π·Π°Π΄Π°ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠΈΡΡΡΡ
Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΏΡΠ°Π²ΡΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΅ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ
ΠΡΠ»Π° ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ aiohttp + gunicorn, Π½Π°Π±Π»ΡΠ΄Π°ΠΉΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΈ ΡΠΎ ΠΆΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΊΠΎΠ³Π΄Π° ctrl + c.
[INFO] ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ Π·Π°ΠΊΡΡΡΠΈΠΈ ΡΠΎΠΊΠ΅ΡΠ° [Errno 9] ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°
Π― Π΅Π³ΠΎ Π½Π΅ Π²ΠΎΡΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Ρ. Π― ΠΏΠΎΠ΄ΠΎΠ·ΡΠ΅Π²Π°Ρ, ΡΡΠΎ Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΎΠΏΠΈΡΠ°Π½Π½ΡΡ Π²ΡΡΠ΅.
Π£ Π½Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° ΡΠ° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² 1 ΠΈΠ· 8 ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΡ Π² ΡΠΎΠ΅ Π΄ΠΎΠΊΠ΅ΡΠΎΠ².
ΠΡ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ 1 ΠΈΠ· 9 ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², ΠΏΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΡΡΠΎ ΡΠ²ΡΠ·Π°Π½ΠΎ Ρ docker, python3 ΠΈ gevent.
Gunicorn 20.0.4 + aiohttp 3.6.2
Gunicorn ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ:
gunicorn --reload app:make_app --bind localhost:5000 --worker-class aiohttp.GunicornWebWorker --workers 2 --access-logfile -
ΠΠΎΡΡΠΈ ΠΊΠ°ΠΆΠ΄ΡΠΉ Ctrl + C Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π°
^C[2020-05-23 21:49:50 +0200] [38524] [INFO] Handling signal: int
Exception ignored when trying to write to the signal wakeup fd:
Exception ignored when trying to write to the signal wakeup fd:
Traceback (most recent call last):
File "/usr/lib/python3.8/asyncio/unix_events.py", line 42, in _sighandler_noop
Traceback (most recent call last):
File "/usr/lib/python3.8/asyncio/unix_events.py", line 42, in _sighandler_noop
def _sighandler_noop(signum, frame):
def _sighandler_noop(signum, frame):
OSError: [Errno 9] Bad file descriptor
OSError: [Errno 9] Bad file descriptor
[2020-05-23 21:49:50 +0200] [38526] [INFO] Worker exiting (pid: 38526)
[2020-05-23 21:49:50 +0200] [38528] [INFO] Worker exiting (pid: 38528)
[2020-05-23 21:49:50 +0200] [38524] [INFO] Shutting down: Master
ΠΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΡΠΎΡ ΠΈΠ»ΠΈ Π½Π΅Ρ.
Π‘ Sanic 20.3.0:
^C[2020-05-26 13:24:55 +0200] [27706] [INFO] Handling signal: int
[2020-05-26 13:24:55 +0200] [27769] [INFO] Stopping server: 27769, connections: 0
[2020-05-26 13:24:55 +0200] [27769] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-05-26 13:24:55 +0200] [27769] [INFO] Worker exiting (pid: 27769)
[2020-05-26 13:24:55 +0200] [27771] [INFO] Stopping server: 27771, connections: 0
[2020-05-26 13:24:55 +0200] [27771] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-05-26 13:24:55 +0200] [27771] [INFO] Worker exiting (pid: 27771)
[2020-05-26 13:24:55 +0200] [27706] [INFO] Shutting down: Master
Π’ΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ ΠΈ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ Gunicorn 20.0.4 + Uvicorn 0.11.5 Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Ctrl + C
INFO: [12621] [gunicorn.error] Handling signal: int
INFO: [12635] [gunicorn.error] Error while closing socket [Errno 9] Bad file descriptor
INFO: [12634] [gunicorn.error] Error while closing socket [Errno 9] Bad file descriptor
INFO: [12635] [gunicorn.error] Worker exiting (pid: 12635)
INFO: [12634] [gunicorn.error] Worker exiting (pid: 12634)
INFO: [12621] [gunicorn.error] Shutting down: Master
ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ? Π’Π°ΠΊΠΆΠ΅ ΠΎ ΠΊΠ°ΠΊΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ Python ΠΌΡ Π³ΠΎΠ²ΠΎΡΠΈΠΌ?
Ubuntu 20.04, ΡΠΈΡΡΠ΅ΠΌΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΠ»Π° Python 3.8.2 Π² virtualenv
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: https://github.com/zgoda/newsloop-server/tree/d603a1c10c9e8be3d998f62ccc55dd73f4677115 (Ρ aiohttp) ΠΈΠ»ΠΈ https://github.com/zgoda/newsloop-server/tree/b09b2a8a8a7 Π’ΠΎΡΠ½ΡΠΉ ΠΏΡΠΈΠ·ΡΠ² ΠΏΡΠ»Π΅ΠΌΠ΅ΡΡΠΈΠΊΠ° Π² ΠΌΠΎΠ΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
Π Π°Π·Π»ΠΈΡΠΈΡ Π² Π²ΡΠ²ΠΎΠ΄Π΅ ΠΌΠ΅ΠΆΠ΄Ρ aiohttp ΠΈ Sanic Π·Π°ΡΡΠ°Π²Π»ΡΡΡ ΠΌΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΎΠ·ΡΠ΅Π²Π°ΡΡ, ΡΡΠΎ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΡΡΠΎ-ΡΠΎ Π½Π΅ ΡΠ°ΠΊ.
Π’Π° ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, python 3.8.0
sanic 19.12.2
Gunicorn 20.0.4
ΠΠ·ΠΌΠ΅Π½ΠΈΡΡ: ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, ΠΊΠΎΠ³Π΄Π° Ρ Π·Π°ΠΏΡΡΠΊΠ°Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ Π½Π° ΡΠ²ΠΎΠ΅ΠΌ Mac, Π½ΠΎ Π½Π΅ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ Π² Π΄ΠΎΠΊΠ΅ΡΠ΅ Linux, ΠΌΠΎΠΆΠ΅Ρ Π²Π°ΠΌ ΠΏΠΎΠΌΠΎΡΡ
ΠΡΠΈΠ²Π΅Ρ,
Π― ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° https://github.com/benoitc/gunicorn/issues/2064 ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅ ΠΆΠ΅ ΠΏΡΠΈΡΠΈΠ½Ρ.
Π£ Π½Π°Ρ ΠΏΠΎΡΡΠΈ ΡΠ΅ ΠΆΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΡΡΠΎ ΠΈ Π² issue, Π½ΠΎ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ gunicorn - 19.9.0
Π― ΡΠΎΠΆΠ΅ ΠΈΡΠΏΡΡΡΠ²Π°Ρ ΡΡΠΎ, FastAPI + Π½ΠΎΠ²Π΅ΠΉΡΠΈΠ΅ ΡΠ°Π±ΠΎΡΠΈΠ΅ Gunicorn ΠΈ uvicorn Ρ Python 3.8.5
ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ uvicorn (Ρ.Π΅. ΡΠ΄Π°Π»Ρ ΡΡΡ ΡΡΡΠΎΠΊΡ ΠΈΠ· ΠΌΠΎΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ gunicorn):
worker_class = "uvicorn.workers.UvicornWorker"
ΠΡΠΈΠ±ΠΊΠΈ ΠΈΡΡΠ΅Π·Π°ΡΡ.
ΠΠ°ΠΊ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π²ΡΡΠ΅, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Gunicorn Ρ ΠΏΠΎΠΌΠΎΡΡΡ Ctrl + C ΠΈΠ»ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ ΠΈΠ·ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΡ Π½Π° PID.
[2020-09-12 11:56:37 +1000] [100390] [INFO] Starting gunicorn 20.0.4
[2020-09-12 11:56:37 +1000] [100390] [INFO] Listening at: http://0.0.0.0:6000 (100390)
[2020-09-12 11:56:37 +1000] [100390] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-09-12 11:56:37 +1000] [100392] [INFO] Booting worker with pid: 100392
[2020-09-12 11:56:38 +1000] [100392] [INFO] Started server process [100392]
[2020-09-12 11:56:38 +1000] [100392] [INFO] Waiting for application startup.
[2020-09-12 11:56:38 +1000] [100392] [INFO] Application startup complete.
[2020-09-12 11:56:48 +1000] [100390] [INFO] Handling signal: term
[2020-09-12 11:56:48 +1000] [100392] [INFO] Shutting down
[2020-09-12 11:56:48 +1000] [100392] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-09-12 11:56:48 +1000] [100392] [INFO] Waiting for application shutdown.
[2020-09-12 11:56:48 +1000] [100392] [INFO] Application shutdown complete.
[2020-09-12 11:56:48 +1000] [100392] [INFO] Finished server process [100392]
[2020-09-12 11:56:48 +1000] [100392] [INFO] Worker exiting (pid: 100392)
[2020-09-12 11:56:48 +1000] [100390] [INFO] Shutting down: Master
ΠΠΎΡ ΡΠΎΡΠ½Π°Ρ ΠΊΠΎΠΏΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ:
[fots<strong i="6">@workstation</strong> testing]$ python3.8 -V
Python 3.8.5
[fots<strong i="7">@workstation</strong> testing]$ python3.8 -m venv ~/.virtualenv/testing
[fots<strong i="8">@workstation</strong> testing]$ source ~/.virtualenv/testing/bin/activate
(testing) [fots<strong i="9">@workstation</strong> testing]$ pip install fastapi gunicorn uvicorn
Collecting fastapi
Using cached fastapi-0.61.1-py3-none-any.whl (48 kB)
Collecting gunicorn
Using cached gunicorn-20.0.4-py2.py3-none-any.whl (77 kB)
Collecting uvicorn
Using cached uvicorn-0.11.8-py3-none-any.whl (43 kB)
Collecting pydantic<2.0.0,>=1.0.0
Using cached pydantic-1.6.1-cp38-cp38-manylinux2014_x86_64.whl (11.5 MB)
Collecting starlette==0.13.6
Using cached starlette-0.13.6-py3-none-any.whl (59 kB)
Requirement already satisfied: setuptools>=3.0 in /home/fots/.virtualenv/testing/lib/python3.8/site-packages (from gunicorn) (47.1.0)
Collecting h11<0.10,>=0.8
Using cached h11-0.9.0-py2.py3-none-any.whl (53 kB)
Collecting websockets==8.*
Using cached websockets-8.1-cp38-cp38-manylinux2010_x86_64.whl (78 kB)
Collecting httptools==0.1.*; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
Using cached httptools-0.1.1-cp38-cp38-manylinux1_x86_64.whl (227 kB)
Collecting uvloop>=0.14.0; sys_platform != "win32" and sys_platform != "cygwin" and platform_python_implementation != "PyPy"
Using cached uvloop-0.14.0-cp38-cp38-manylinux2010_x86_64.whl (4.7 MB)
Collecting click==7.*
Using cached click-7.1.2-py2.py3-none-any.whl (82 kB)
Installing collected packages: pydantic, starlette, fastapi, gunicorn, h11, websockets, httptools, uvloop, click, uvicorn
Successfully installed click-7.1.2 fastapi-0.61.1 gunicorn-20.0.4 h11-0.9.0 httptools-0.1.1 pydantic-1.6.1 starlette-0.13.6 uvicorn-0.11.8 uvloop-0.14.0 websockets-8.1
WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.
You should consider upgrading via the '/home/fots/.virtualenv/testing/bin/python3.8 -m pip install --upgrade pip' command.
(testing) [fots<strong i="10">@workstation</strong> testing]$ ls -l
total 4
-rw-rw-r-- 1 fots fots 117 Sep 12 12:13 main.py
(testing) [fots<strong i="11">@workstation</strong> testing]$ cat main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
async def root():
return {"message": "Hello World"}
(testing) [fots<strong i="12">@workstation</strong> testing]$ gunicorn -k uvicorn.workers.UvicornWorker main:app
[2020-09-12 12:19:05 +1000] [105788] [INFO] Starting gunicorn 20.0.4
[2020-09-12 12:19:05 +1000] [105788] [INFO] Listening at: http://127.0.0.1:8000 (105788)
[2020-09-12 12:19:05 +1000] [105788] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-09-12 12:19:05 +1000] [105790] [INFO] Booting worker with pid: 105790
[2020-09-12 12:19:05 +1000] [105790] [INFO] Started server process [105790]
[2020-09-12 12:19:05 +1000] [105790] [INFO] Waiting for application startup.
[2020-09-12 12:19:05 +1000] [105790] [INFO] Application startup complete.
^C[2020-09-12 12:19:06 +1000] [105788] [INFO] Handling signal: int
[2020-09-12 12:19:06 +1000] [105790] [INFO] Shutting down
[2020-09-12 12:19:06 +1000] [105790] [INFO] Error while closing socket [Errno 9] Bad file descriptor
[2020-09-12 12:19:06 +1000] [105790] [INFO] Waiting for application shutdown.
[2020-09-12 12:19:06 +1000] [105790] [INFO] Application shutdown complete.
[2020-09-12 12:19:06 +1000] [105790] [INFO] Finished server process [105790]
[2020-09-12 12:19:06 +1000] [105790] [INFO] Worker exiting (pid: 105790)
[2020-09-12 12:19:07 +1000] [105788] [INFO] Shutting down: Master
Π Π²ΠΎΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ pip freeze
:
click==7.1.2
fastapi==0.61.1
gunicorn==20.0.4
h11==0.9.0
httptools==0.1.1
pydantic==1.6.1
starlette==0.13.6
uvicorn==0.11.8
uvloop==0.14.0
websockets==8.1
Π― ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ uvicorn ΠΈ gunicorn Ρ GitHub (ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ Π²Π΅ΡΠΊΠ°), ΡΡΠΎΠ±Ρ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Ρ ΠΏΠΎΠ»ΡΡΠΈΠ» ΡΠ°ΠΌΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, Π½ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ ΠΈΡΡΠ΅Π·Π»Π°.
ΠΠ°Π΄Π΅ΡΡΡ ΡΡΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ
Π€ΠΎΡΠΈΡ
gunicorn
ΠΈ uvicorn
. ΠΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ uvicorn==0.11.4
Π° Π½Π΅ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ 0.11.3
(ΠΊΠ°ΠΊ Π² OSx, ΡΠ°ΠΊ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Linux). ΠΡΠΎ ΡΠΎΠ³Π»Π°ΡΡΠ΅ΡΡΡ Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌΠΈ Π²ΡΡΠ΅ ΠΎΡΡΠ΅ΡΠ°ΠΌΠΈ ΠΎ uvicorn, Π³Π΄Π΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ 0.11.4
. ΠΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π² ΠΊΠΎΠ½ΡΠ΅uvicorn
starlette
ΠΈ fastapi
ΠΏΠΎΠ²Π΅ΡΡ
ΡΡΠ΅ΠΊΠ° gunicorn+uvicorn
ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅; - Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ uvicorn 12.X
Π²ΠΌΠ΅ΡΡΠΎ 0.11.4
; - Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ gunicorn
Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌ uvicorn
workerΠΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° . Π Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π° osx Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ test.sh
(ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° osx). ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Linux ΡΠΎΡ
ΡΠ°Π½ΠΈΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈ ΡΠ°ΠΉΠ» Dockerfile, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΈΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ»Π° Dockerfile. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π»ΠΎΠ³ ΡΠΊΡΠΈΠΏΡΠ°.
@benoitc , ΡΡΠΎ Π²Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅ ΠΎΠ± ΡΡΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ Π² uvicorn
ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π²Π½ΠΎΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ? ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡ
ΠΎΠΆΠ΅, Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ gunicorn
ΠΈ uvicorn
. ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΡΠΎΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄Π²ΡΡ
Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ
Π² ΠΊΠΎΠΌΠΌΠΈΡΠ΅, ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠΌ Π²ΡΡΠ΅ Π² uvicorn
? ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
. ΠΠΎ ΡΠΈΡ
ΠΏΠΎΡ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ°Π»ΠΎΡΡ ΡΠ°ΠΊΠΆΠ΅ Ρ aiohttp
, gevent
, Flask-SocketIO
sanic
. ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΡΠ΅Π½Π°ΡΠΈΡ.
ΡΠ°ΠΉΠ» _test.sh_
#!/bin/bash
python3 -m venv venv
source venv/bin/activate
pip install gunicorn==20.0.04 uvicorn==0.11.4
# create simple uvicorn app
printf "async def app(scope, receive, send):\n await send()\n" > example.py
# spin up gunicorn with 1 uvicorn worker, and then send TERM signal to gunicorn
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn
sleep 1
# you will see 1 log entry like this one:
# [XX] [YY] [INFO] Error while closing socket [Errno 9] Bad file descriptor
printf "\n\n[INFO] if you instead bump down uvicorn's version from 11.4 to 11.3 [Errno 9] goes away:\n\n"
pip install uvicorn==0.11.3
gunicorn example:app -w 1 -k uvicorn.workers.UvicornWorker &
sleep 5 && pkill -f gunicorn
ΡΠ°ΠΉΠ» _Dockerfile_
# run with:
# docker run -it $(docker build -q .)
FROM python:3.8
COPY test.sh .
RUN chmod +x /test.sh
CMD /test.sh
Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»Π° ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°. ΠΠΎΡ ΠΌΠΎΠΉ ΡΠ»ΡΡΠ°ΠΉ.
ΠΡΠ°ΡΠΊΠΎ: Ρ ΠΏΡΡΠ°ΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠ΅ΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Django dwebsocket Ρ ΠΏΠΎΠΌΠΎΡΡΡ Gunicorn. ΠΠΎΠ³Π΄Π° Ρ ΠΏΡΡΠ°ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ websocket_client Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°, ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΊΡΡΡΠΈΡ websocket ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·.
ΠΠΊΡΡΠΆΠ°ΡΡΠ°Ρ ΠΎΠ±ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° :
ΠΠ±ΡΠ°Π· Π΄ΠΎΠΊΠ΅ΡΠ°: python: 3.7
Π²Π΅ΡΡΠΈΡ python: python3.7.6
gunicorn: Π²Π΅ΡΡΠΈΡ = 20.0.4, ΡΠ°Π±ΠΎΡΠ° = gevent
ΠΠ΅ΡΡΠΈΡ Django: Django == 2.2
Π²Π΅ΡΡΠΈΡ dwebsocket: 0.5.12
ΠΠΎΠ΄:
view.py
from dwebsocket import accept_websocket
<strong i="16">@accept_websocket</strong>
def my_ws(request):
if request.is_websocket():
ws = request.websocket
while True:
msg = ws.wait(timeout=15)
if msg is None:
print('get None message')
break
else:
msg = b'echo :' + msg
ws.send(msg)
print('send ws seccess')
print('websocket close')
urls.py
from websocketInfo.views import my_ws
from django.conf.urls import url
urlpatterns = [
url(r'my_ws/$', my_ws, name='my_ws')
]
websocket_client
from websocket import create_connection
ws = create_connection("ws://127.0.0.1:8080/my_ws/")
print("Sending 'Hello, World'...")
ws.send("Hello, World")
print("Receiving...")
result = ws.recv()
print(result)
ws.close()
print('ws close')
ΠΊΠΎΠΌΠ°Π½Π΄Π° Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ° Gunicorn
gunicorn MyWebsocket.wsgi -b 0.0.0.0:8000 -w 3 -k gevent
Π²ΡΠ²ΠΎΠ΄ ΠΎΡΠΈΠ±ΠΎΠΊ
send ws seccess
get None message
websocket close
[2021-01-13 02:43:56 +0000] [101] [ERROR] Socket error processing request.
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 65, in handle
util.reraise(*sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 625, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 55, in handle
self.handle_request(listener_name, req, client, addr)
File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/ggevent.py", line 143, in handle_request
super().handle_request(listener_name, req, sock, addr)
File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 128, in handle_request
util.reraise(*sys.exc_info())
File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 625, in reraise
raise value
File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base_async.py", line 114, in handle_request
resp.write(item)
File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 326, in write
self.send_headers()
File "/usr/local/lib/python3.7/site-packages/gunicorn/http/wsgi.py", line 322, in send_headers
util.write(self.sock, util.to_bytestring(header_str, "latin-1"))
File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 286, in write
sock.sendall(data)
File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 523, in sendall
return _socketcommon._sendall(self, data_memory, flags)
File "/usr/local/lib/python3.7/site-packages/gevent/_socketcommon.py", line 367, in _sendall
chunk_size = max(socket.getsockopt(SOL_SOCKET, SO_SNDBUF), 1024 * 1024)
File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 156, in __getattr__
return getattr(self._sock, name)
File "/usr/local/lib/python3.7/site-packages/gevent/_socket3.py", line 66, in _dummy
raise OSError(EBADF, 'Bad file descriptor')
OSError: [Errno 9] Bad file descriptor
@ChrisXiaoShu ΠΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Π°Ρ Π²Π°ΠΌΠΈ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΡΡΠ΅ΠΊΠ° ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ Π½Π°ΠΌ, ΡΡΠΎ ΡΡΠΎΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠΊΠ΅ΡΠ° Π±ΡΠ» ΡΠ²Π½ΠΎ Π·Π°ΠΊΡΡΡ Π½Π° ΡΡΠΎΠ²Π½Π΅ Python (ΡΡΠΎ ΠΊΠΎΠ³Π΄Π° gevent ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ²ΠΎΠΉ _dummy
Π΄Π»Ρ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΡΠ΅Ρ
ΠΆΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠΉ, ΡΡΠΎ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°). ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΡΡΠ΅ΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ ΡΠΎΠΊΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄ Π²ΠΎΠ·Π²ΡΠ°ΡΠΎΠΌ ΠΎΡΠ²Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Gunicorn ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°ΡΡ Π΅Π³ΠΎ; Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ Gunicorn Π΅ΡΠ΅ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΎΡΠΏΡΠ°Π²ΠΈΠ» Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ HTTP-ΠΎΡΠ²Π΅ΡΠ°.
Π ΠΌΠΎΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΡΠΎΠΉ ΡΠ°Π·Π½ΠΈΡΠ΅ΠΉ, ΡΡΠΎ ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ. ΠΠ½ΠΎΠ³Π΄Π° ΡΠ΅ΡΠ΅Π· 5 ΠΌΠΈΠ½ΡΡ, ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠ΅ΡΠ΅Π· 2 ΡΠ°ΡΠ° ...
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
gunicorn
ΠΈuvicorn
. ΠΡΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρuvicorn==0.11.4
Π° Π½Π΅ Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ0.11.3
(ΠΊΠ°ΠΊ Π² OSx, ΡΠ°ΠΊ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Linux). ΠΡΠΎ ΡΠΎΠ³Π»Π°ΡΡΠ΅ΡΡΡ Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌΠΈ Π²ΡΡΠ΅ ΠΎΡΡΠ΅ΡΠ°ΠΌΠΈ ΠΎ uvicorn, Π³Π΄Π΅ ΡΠΊΠ°Π·Π°Π½Π½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ0.11.4
. ΠΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° Π² ΠΊΠΎΠ½ΡΠ΅uvicorn
starlette
ΠΈfastapi
ΠΏΠΎΠ²Π΅ΡΡ ΡΡΠ΅ΠΊΠ°gunicorn+uvicorn
ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅; - Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ uvicorn12.X
Π²ΠΌΠ΅ΡΡΠΎ0.11.4
; - Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρgunicorn
Ρ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅ΠΌ ΠΎΠ΄Π½ΠΈΠΌuvicorn
workerΠΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΡΡΡΠ²Π° . Π Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π° osx Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½Π½ΡΠΉ ΡΠΊΡΠΈΠΏΡ
test.sh
(ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ Π½Π° osx). ΠΠ»Ρ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅ Linux ΡΠΎΡ ΡΠ°Π½ΠΈΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΉ ΠΈ ΡΠ°ΠΉΠ» Dockerfile, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΈΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠ°ΠΉΠ»Π° Dockerfile. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΈΠ»Π°Π³Π°Ρ Π»ΠΎΠ³ ΡΠΊΡΠΈΠΏΡΠ°.@benoitc , ΡΡΠΎ Π²Ρ Π΄ΡΠΌΠ°Π΅ΡΠ΅ ΠΎΠ± ΡΡΠΎΠΉ ΡΠΈΠΊΡΠ°ΡΠΈΠΈ Π²
uvicorn
ΠΊΠΎΡΠΎΡΠ°Ρ, ΠΊΠ°ΠΆΠ΅ΡΡΡ, Π²Π½ΠΎΡΠΈΡ ΠΎΡΠΈΠ±ΠΊΡ? ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΏΠΎΡ ΠΎΠΆΠ΅, Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρgunicorn
ΠΈuvicorn
. ΠΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π²Ρ ΠΏΡΠΎΠΊΠΎΠΌΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄Π²ΡΡ Π±Π»ΠΎΠΊΠΎΠ² ΠΊΠΎΠ΄Π°, ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ Π² ΠΊΠΎΠΌΠΌΠΈΡΠ΅, ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠΌ Π²ΡΡΠ΅ Π²uvicorn
? ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠΎΡΡ Π²ΡΡΡΠ½ΠΈΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ . ΠΠΎ ΡΠΈΡ ΠΏΠΎΡ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ°Π»ΠΎΡΡ ΡΠ°ΠΊΠΆΠ΅ Ρaiohttp
,gevent
,Flask-SocketIO
sanic
. ΠΠ»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΏΡΠΈΠ»Π°Π³Π°Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» ΡΡΠ΅Π½Π°ΡΠΈΡ.log_test.log
ΡΠ°ΠΉΠ» _test.sh_
ΡΠ°ΠΉΠ» _Dockerfile_