MonkeyPatchWarning: Monkey-patching ssl после того, как ssl уже был импортирован, может привести к ошибкам

Фон

У меня есть приложение Django, в котором много iobound, поэтому, согласно документации, которую я прочитал, я пытаюсь заставить gunincorn работать с gevent для лучшей производительности.

Ошибка

dev1            | Patching Started
dev1            | /app/Dev/wsgi.py:19: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. It may also silently lead to incorrect behaviour on Python 3.7. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016. Modules that had direct imports (NOT patched): ['urllib3.util (/usr/local/lib/python3.9/site-packages/urllib3/util/__init__.py)', 'urllib3.util.ssl_ (/usr/local/lib/python3.9/site-packages/urllib3/util/ssl_.py)']. 
dev1            |   monkey.patch_all(thread=False, select=False)
dev1            | Patching Done
dev1            | /usr/local/lib/python3.9/site-packages/paramiko/transport.py:236: CryptographyDeprecationWarning: Blowfish has been deprecated
dev1            |   "class": algorithms.Blowfish,
dev1            | /usr/local/lib/python3.9/site-packages/gunicorn/workers/ggevent.py:38: MonkeyPatchWarning: Patching more than once will result in the union of all True parameters being patched
dev1            |   monkey.patch_all()
dev1            | /usr/local/lib/python3.9/site-packages/gunicorn/workers/ggevent.py:38: MonkeyPatchWarning: Patching more than once will result in the union of all True parameters being patched
dev1            |   monkey.patch_all()
dev1            | /usr/local/lib/python3.9/site-packages/gunicorn/workers/ggevent.py:38: MonkeyPatchWarning: Patching more than once will result in the union of all True parameters being patched
dev1            |   monkey.patch_all()
...

Настройка

wsgi.py

# Needs to happen first
print("Patching Started")
from gevent import monkey
monkey.patch_all(thread=False, select=False)
# monkey.patch_all()
from psycogreen.gevent import patch_psycopg
patch_psycopg()
print("Patching Done")

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Dev.settings')

application = get_wsgi_application()

Команда Докер-Композит

    command:
      - |
        gunicorn Dev.wsgi:application  
        --bind 0.0.0.0:8000 
        --workers 10 
        --timeout 30 
        --preload 
        --access-logfile /dev/stdout 
        --worker-class gevent"

Проблема

Мне кажется, что я должен поставить патч monkey.patch() в правильное место, когда gunicorn забирает его в самом начале, но почему-то urllib3.util загружается первым. Правильно ли я ставлю патч обезьяны?

Предположу, что у вас есть файл gunicorn.conf.py. Пробовали ли вы добавить

monkey.patch_all(thread=False, select=False)

в верхней части этого файла?

Похоже, это помогло мне, после того как я прошел через ту же проблему, которую вы только что описали. Дайте мне знать, если это поможет.

Вернуться на верх