Gunicorn: OSError: [Errno 9] рдЦрд░рд╛рдм рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рд╕рд┐рддре░ 2018  ┬╖  19рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: benoitc/gunicorn

рдореБрдЭреЗ рд░рд╛рд╕реНрдкрд┐рдпрди рдЫрд╡рд┐ рдореЗрдВ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдЖ рд░рд╣реА рд╣реИ

[2018-09-10 20:40:11 +0800] [21421] [рдорд╣рддреНрд╡рдкреВрд░реНрдг] рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд (рдкреАрдЖрдИрдбреА: 21699)
[2018-09-10 20:40:11 +0800] [21699] [рддреНрд░реБрдЯрд┐] рд╕реЙрдХреЗрдЯ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрд░реЛрдзред
рдЯреНрд░реЗрд╕рдмреИрдХ (рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рдХреЙрд▓ рдЕрдВрддрд┐рдо):
рдлрд╝рд╛рдЗрд▓ "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", рд▓рд╛рдЗрди 62, рд╣реИрдВрдбрд▓ рдореЗрдВ
рдЫрд╣.рд░реЗрд░рд╛рдЗрдЬ (* sys.exc_info ())
рдлрд╝рд╛рдЗрд▓ "/usr/lib/python3/dist-packages/gunicorn/six.py", рд▓рд╛рдЗрди 625, рдкреБрдирд░реНрд░рд╛рдЗрдЬ рдореЗрдВ
рдореВрд▓реНрдп рдмрдврд╝рд╛рдПрдБ
рдлрд╝рд╛рдЗрд▓ "/usr/lib/python3/dist-packages/gunicorn/workers/async.py", рд▓рд╛рдЗрди 35, рд╣реИрдВрдбрд▓ рдореЗрдВ
рд╢реНрд░реЛрддрд╛_рдирд╛рдо = рд╢реНрд░реЛрддрд╛.рдЧреЗрдЯреНрд╕реЙрдХрдирд╛рдо ()
OSError: [Errno 9] рдЦрд░рд╛рдм рдлрд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░

Feedback Requested Investigation

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

  1. рдореИрдВ рдЗрд╕ рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреЗрд╡рд▓ gunicorn рдФрд░ uvicorn рд╕рд╛рде рдПрдХ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ uvicorn==0.11.4 рд╕рд╛рде рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рди рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг 0.11.3 (OSx рдФрд░ Linux рдХрдВрдЯреЗрдирд░ рджреЛрдиреЛрдВ рдкрд░)ред рдпрд╣ рдпреВрд╡рд┐рдХреЙрд░реНрди рдХреЗ рд╕рд╛рде рдКрдкрд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЬрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ 0.11.4 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ рд╕рд╛рдХреНрд╖реНрдп
  2. рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрдорд┐рдЯрдореЗрдВрдЯ рдпрд╣ рд╣реИ ред рд╕рдорд╕реНрдпрд╛ рдЕрднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреА рдЗрди рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдХрдорд┐рдЯ рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рджреЛ рдмреНрд▓реЙрдХ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдСрд░реНрдбрд░ рдХреЗ рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреВрдВ, рддреЛ рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬрдмрдХрд┐ рдЕрднреА рднреА uvicorn рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ
  3. рд╡рд╣реА рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдХреЛрдИ: рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ starlette рдФрд░ fastapi рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ gunicorn+uvicorn рдХрд░рддрд╛ рд╣реИ; - рдирд╡реАрдирддрдо uvicorn рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИ 12.X рдХреЗ рдмрдЬрд╛рдп 0.11.4 ; - gunicorn рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ uvicorn рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ

рд╕рдмреВрдд ред рдУрдПрд╕рдПрдХреНрд╕ рдкрд░ рдПрдХ рдирдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ test.sh (рдУрдПрд╕рдПрдХреНрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг) рдЪрд▓рд╛рдПрдВред Linux рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ Dockerfile рджреЛрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдлрд┐рд░ Dockerfile рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓реЙрдЧ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВред

@benoitc , uvicorn рдореЗрдВ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рдмрдЧ рдкреЗрд╢ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рд╕рдорд╕реНрдпрд╛ gunicorn рдФрд░ uvicorn рдмреАрдЪ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдореЗрдВ uvicorn рдореЗрдВ рдмрджрд▓реЗ рдЧрдП рдХреЛрдб рдХреЗ 2 рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдХреНрд░рдо рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдм рддрдХ aiohttp , gevent , Flask-SocketIO sanic рд╕рд╛рде рднреА рдЗрд╕рдХреА рд╕реВрдЪрдирд╛ рдорд┐рд▓реА рд╣реИред рдореИрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓реЙрдЧ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВред

log_test.log

рдлрд╝рд╛рдЗрд▓ _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

рдлрд╝рд╛рдЗрд▓ _рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓_

# run with:
# docker run -it $(docker build -q .)
FROM python:3.8
COPY test.sh .
RUN chmod +x /test.sh
CMD /test.sh

рд╕рднреА 19 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

@leond08 рдЯрд┐рдХрдЯ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрд╣ рдХреИрд╕реЗ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЖрдк рдХреБрдЫ рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ?

  • рдЖрдк Gunicorn рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  • рдЖрдк рдХрд┐рд╕ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ
  • рдпрд╣ рдХрдм рд╣реЛрддрд╛ рд╣реИ?

рдореИрдВ gunicorn3 рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрд╡реЗрдВрдЯрд▓реЗрдЯ рдФрд░ рдЧреАрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ
рдореИрдВ рдЕрдкрдирд╛ рдлреНрд▓рд╛рд╕реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ - рдлреНрд▓рд╛рд╕реНрдХ-рд╕реЙрдХреЗрдЯрд┐рдпреЛ

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореИрдВ рдЕрдкрдирд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реВрдВ
рдореЗрд░рд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЯрд╛рд╕реНрдХ рдлрдВрдХреНрд╢рди рдХрд┐рд╕реА рдЗрд╡реЗрдВрдЯ рдХреЛ рд╕реБрдирдирд╛ рд╣реИ,
"рд╕рдВрдкрдиреНрди" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛рд░реНрдп рд░реБрдХрдирд╛ рдЪрд╛рд╣рд┐рдП
рдлрд┐рд░ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ

aiohttp + gunicorn рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдереА, рдЙрд╕реА рд╕рдВрджреЗрд╢ рдХреЛ рд╣рд░ рдмрд╛рд░ рджреЗрдЦреЗрдВ рдЬрдм ctrl + c.

[рд╕реВрдЪрдирд╛] рд╕реЙрдХреЗрдЯ рдмрдВрдж рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ [рддреНрд░реБрдЯрд┐ 9] рдЦрд░рд╛рдм рдлрд╝рд╛рдЗрд▓ рд╡рд┐рд╡рд░рдгрдХ

рдореИрдВ рдЗрд╕реЗ рдкреБрди: рдкреЗрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ред рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдЖрд╡реЗрджрди рдХреБрдЫ рдПрдлрдбреА рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИ рдЬреЛ рдКрдкрд░ рдХреА рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдбреЙрдХ рдЭреБрдВрдб рдореЗрдВ рдЪрд▓ рд░рд╣реЗ 8 рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рд╕реЗ 1 рдкрд░ рд╣реА рд╣реЛ рд░рд╣рд╛ рд╣реИред

рд╣рдордиреЗ 9 рдореЗрдВ рд╕реЗ 1 рдХрдВрдЯреЗрдирд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ docker рдФрд░ python3 рдФрд░ gevent рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред

рдЧрдирд┐рдХреЛрд░реНрди 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

рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрд╡реЗрджрди рдиреЗ рдХрд┐рд╕реА рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрднрд╛рд▓рд╛ рдпрд╛ рдирд╣реАрдВред

рд╕реИрдирд┐рдХ 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

рд╣рд░ Ctrl+C . рдкрд░ Gunicorn 20.0.4 + Uvicorn 0.11.5 рд╡рд░реНрдХрд░ рдХреНрд▓рд╛рд╕ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рд╣реИ

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

рдЖрд╡реЗрджрди рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг? рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣рдо рдкрд╛рдпрдерди рдХреЗ рдХрд┐рд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ?

рдЙрдмрдВрдЯреВ 20.04, рд╡рд░реНрдЪреБрдЕрд▓рдПрдиреНрд╡ рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдиреЗ рдкрд╛рдпрдерди 3.8.2 рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛

рдЙрджрд╛рд╣рд░рдг рдЖрд╡реЗрджрди: https://github.com/zgoda/newsloop-server/tree/d603a1c10c9e8be3d998f62ccc55dd73f4677115 (aiohttp рдХреЗ рд╕рд╛рде) рдпрд╛ https://github.com/zgoda/newsloop-server/tree/b2a8a7f09fa9848d0384b51037fb459e (Sanic рдХреЗ рд╕рд╛рде)ред рдореЗрд░реА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдЯреАрдХ рдЧрдирд┐рдХреЛрд░реНрди рдордВрдЧрд▓рд╛рдЪрд░рдгред

aiohttp рдФрд░ Sanic рдХреЗ рдмреАрдЪ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдЕрдВрддрд░ рдореБрдЭреЗ рд╕рдВрджреЗрд╣рд╛рд╕реНрдкрдж рдмрдирд╛рддрд╛ рд╣реИ рдХрд┐ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рдЧрдбрд╝рдмрдбрд╝ рд╣реИред

рдПрдХ рд╣реА рдореБрджреНрджрд╛, рдЕрдЬрдЧрд░ 3.8.0
рд╕реИрдирд┐рдХ 19.12.2
рдЧрдирд┐рдХреЛрд░реНрди 20.0.4

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдореИрдВ рдЕрдкрдиреЗ рдореИрдХ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рд▓рд┐рдирдХреНрд╕ рдбреЙрдХрдЯрд░ рдХреЗ рдЕрдВрджрд░ рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдкрдХреЛ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ

рдирдорд╕реНрддреЗ,
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ https://github.com/benoitc/gunicorn/issues/2064 рдХреЗ рд╕рдорд╛рди рдХрд╛рд░рдг рд╣реИрдВред
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рдЧрднрдЧ рд╕рдорд╛рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЕрдВрдХ рдореЗрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЧрдирд┐рдХреЛрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - 19.9.0

рдореИрдВ рднреА рдЗрд╕рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, FastAPI + рдирд╡реАрдирддрдо Gunicorn рдФрд░ uvicorn рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ Python 3.8.5 . рдХреЗ рд╕рд╛рде

рдЬреИрд╕реЗ рд╣реА рдореИрдВ рдпреВрд╡рд┐рдХреЙрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реВрдВ (рдЕрд░реНрдерд╛рдд рдЗрд╕ рд▓рд╛рдЗрди рдХреЛ рдореЗрд░реЗ рдЧрдирд┐рдХреЛрд░реНрди рдХреЙрдиреНрдлрд┐рдЧ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ):

worker_class = "uvicorn.workers.UvicornWorker"

рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЧрдирд┐рдХреЛрд░реНрди рдХреЛ 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

рдореИрдВрдиреЗ рдЧрд┐рдЯрд╣рдм (рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛) рд╕реЗ рдпреВрд╡рд┐рдХреЙрд░реНрди рдФрд░ рдЧрдирд┐рдХреЛрд░реНрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рддрд╛рдХрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛ рд╕рдХреЗ рдХрд┐ рдореБрдЭреЗ рдирд╡реАрдирддрдо рд╕реБрдзрд╛рд░ рдорд┐рд▓реЗ рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдмрдиреА рд░рд╣реАред

рдЙрдореНрдореАрдж рд╣реИ рдХреА рдпрд╣ рдорджрдж рдХрд░реЗрдЧрд╛
рдлреЛрдЯрд┐рд╕

  1. рдореИрдВ рдЗрд╕ рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рдХреЛ рдХреЗрд╡рд▓ gunicorn рдФрд░ uvicorn рд╕рд╛рде рдПрдХ рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВред рдпрд╣ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ uvicorn==0.11.4 рд╕рд╛рде рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рди рдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг 0.11.3 (OSx рдФрд░ Linux рдХрдВрдЯреЗрдирд░ рджреЛрдиреЛрдВ рдкрд░)ред рдпрд╣ рдпреВрд╡рд┐рдХреЙрд░реНрди рдХреЗ рд╕рд╛рде рдКрдкрд░ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЬрд╣рд╛рдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рд╣рдореЗрд╢рд╛ 0.11.4 рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ рд╕рд╛рдХреНрд╖реНрдп
  2. рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХрдорд┐рдЯрдореЗрдВрдЯ рдпрд╣ рд╣реИ ред рд╕рдорд╕реНрдпрд╛ рдЕрднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреА рдЗрди рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реИред рдХрдорд┐рдЯ рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рджреЛ рдмреНрд▓реЙрдХ рдХреЗ рдХреНрд░рдо рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдЕрдЧрд░ рдореИрдВ рдСрд░реНрдбрд░ рдХреЗ рдЙрд╕ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреВрдВ, рддреЛ рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬрдмрдХрд┐ рдЕрднреА рднреА uvicorn рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╕реВрдЯ рдХреЛ рдкрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ
  3. рд╡рд╣реА рд▓реЙрдЧ рддреНрд░реБрдЯрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рдХреЛрдИ: рдКрдкрд░ рдмрддрд╛рдП рдЕрдиреБрд╕рд╛рд░ starlette рдФрд░ fastapi рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ gunicorn+uvicorn рдХрд░рддрд╛ рд╣реИ; - рдирд╡реАрдирддрдо uvicorn рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рддрд╛ рд╣реИ 12.X рдХреЗ рдмрдЬрд╛рдп 0.11.4 ; - gunicorn рдХреЗрд╡рд▓ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ uvicorn рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ

рд╕рдмреВрдд ред рдУрдПрд╕рдПрдХреНрд╕ рдкрд░ рдПрдХ рдирдП рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ test.sh (рдУрдПрд╕рдПрдХреНрд╕ рдкрд░ рдкрд░реАрдХреНрд╖рдг) рдЪрд▓рд╛рдПрдВред Linux рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ Dockerfile рджреЛрдиреЛрдВ рдХреЛ рд╕рд╣реЗрдЬреЗрдВ рдФрд░ рдлрд┐рд░ Dockerfile рдХреЗ рд╢реАрд░реНрд╖рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВред рдореИрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓реЙрдЧ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВред

@benoitc , uvicorn рдореЗрдВ рдЗрд╕ рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдк рдХреНрдпрд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рдмрдЧ рдкреЗрд╢ рдХрд░рддрд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ? рд╕рдорд╕реНрдпрд╛ gunicorn рдФрд░ uvicorn рдмреАрдЪ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИред рдХреНрдпрд╛ рдЖрдк рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрджреНрдзрддрд╛ рдореЗрдВ uvicorn рдореЗрдВ рдмрджрд▓реЗ рдЧрдП рдХреЛрдб рдХреЗ 2 рдмреНрд▓реЙрдХреЛрдВ рдХреЗ рдХреНрд░рдо рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рдЗрд╕рд╕реЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИ рдХрд┐ рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ рднреА рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИред рдЕрдм рддрдХ aiohttp , gevent , Flask-SocketIO sanic рд╕рд╛рде рднреА рдЗрд╕рдХреА рд╕реВрдЪрдирд╛ рдорд┐рд▓реА рд╣реИред рдореИрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рд▓реЙрдЧ рднреА рд╕рдВрд▓рдЧреНрди рдХрд░рддрд╛ рд╣реВрдВред

log_test.log

рдлрд╝рд╛рдЗрд▓ _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

рдлрд╝рд╛рдЗрд▓ _рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓_

# run with:
# docker run -it $(docker build -q .)
FROM python:3.8
COPY test.sh .
RUN chmod +x /test.sh
CMD /test.sh

рдореЗрд░реЗ рдкрд╛рд╕ рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдореБрджреНрджрд╛ рдерд╛ред рдпрд╣рд╛рдБ рдореЗрд░рд╛ рдорд╛рдорд▓рд╛ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд: рдореИрдВ Gunicorn рдХреЗ рд╕рд╛рде Django dwebsocket рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЖрд╡реЗрджрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЬрдм рдореИрдВ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП websocket_client рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рддреЛ websocket рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдпрд╣ рддреНрд░реБрдЯрд┐ рд╣рд░ рдмрд╛рд░ рд╣реЛрддреА рд╣реИред

рдкрд░реНрдпрд╛рд╡рд░рдг :
рдбреЙрдХрд░ рдЫрд╡рд┐: рдЕрдЬрдЧрд░: 3.7
рдЕрдЬрдЧрд░ рд╕рдВрд╕реНрдХрд░рдг: рдЕрдЬрдЧрд░ 3.7.6
рдЧрдирд┐рдХреЛрд░реНрди : рд╕рдВрд╕реНрдХрд░рдг = 20.0.4, рдХрд╛рд░реНрдп = рдЧреАрд╡реЗрдВрдЯ
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 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 рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрдЯреИрдХ рдЯреНрд░реЗрд╕ рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЙрдХреЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рдпрдерди рд╕реНрддрд░ рдкрд░ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдпрд╣реА рд╡рд╣ рд╕рдордп рд╣реИ рдЬрдм gevent рдЕрдкрдиреЗ _dummy рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рдЕрдкрд╡рд╛рдж рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХрд░рддрд╛ рд╣реИ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реНрдЯреИрдХ рдХрд╛ рдХреБрдЫ рд╣рд┐рд╕реНрд╕рд╛ рдЧрдиреАрдХреЙрд░реНрди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реЙрдХреЗрдЯ рдХреЛ рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИ; рдЬрд┐рд╕ рдмрд┐рдВрджреБ рдкрд░ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рдЧрдирд┐рдХреЛрд░реНрди рдиреЗ рдЕрднреА рддрдХ HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╢реАрд░реНрд╖рд▓реЗрдЦ рднреА рдирд╣реАрдВ рднреЗрдЬреЗ рдереЗред

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рдХреА рддрд░рд╣, рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рд╕рд╛рде рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреБрдЫ рднреА рдХрд┐рдП рдмрд┐рдирд╛ рд╣реЛрддреА рд╣реИред рдХрднреА 5 рдорд┐рдирдЯ рдХреЗ рдмрд╛рдж рддреЛ рдХрднреА 2 рдШрдВрдЯреЗ рдмрд╛рдж...

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

agilezebra picture agilezebra  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alep picture alep  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

bywangxp picture bywangxp  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

twosigmajab picture twosigmajab  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

haolujun picture haolujun  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ