簡體   English   中英

gUnicorn/gevent:請求庫拋出 RecursionError:超出最大遞歸深度

[英]gUnicorn/gevent: requests library is throwing RecursionError: maximum recursion depth exceeded

我有一個使用 gunicorn 和 gevent 部署的 Flask 應用程序。 我已經放了

import gevent.monkey
gevent.monkey.patch_all()

在 app.py 文件的頂部。

但我仍然收到以下警告和錯誤:

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): ['requests.packages.urllib3.util


  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/api.py", line 110, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/sessions.py", line 596, in send
    r = adapter.send(request, **kwargs)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 595, in urlopen
    chunked=chunked)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 352, in _make_request
    self._validate_conn(conn)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 831, in _validate_conn
    conn.connect()
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 289, in connect
    ssl_version=resolved_ssl_version)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 291, in ssl_wrap_socket
    ciphers=ciphers)
  File "/home/travis/virtualenv/python3.6.3/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 254, in create_urllib3_context
    context.options |= options
  File "/opt/python/3.6.3/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/opt/python/3.6.3/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  File "/opt/python/3.6.3/lib/python3.6/ssl.py", line 465, in options
    super(SSLContext, SSLContext).options.__set__(self, value)
  [Previous line repeated 306 more times]
RecursionError: maximum recursion depth exceeded

我們遇到了類似的問題,發現我們正在用 ddtrace-run(datadog tracer) 包裝 gunicorn,而 ddtrace-run 甚至在 gevent 可以對其進行猴子補丁之前就調用了 urllib3。 有關該錯誤的更多詳細信息,請參見dd-trace-py/issues/506 為了解決這個錯誤,我們升級到最新版本的 ddtrace-run。

ddtrace-run gunicorn -b 0.0.0.0:${PORT} --log-level=${GUNICORN_LOG_LEVEL} ... 'app.main:main()'

如果您在 app.py 的頂部添加了 gevent.monkey.patch_all(),請仔細檢查您是如何調用 gunicorn 入口點的。 在 gevent 和調用 SSL 之前會有一些事情發生。

您可以使用 gunicorn 配置文件解決它,並使用此文件啟動 gunicorn。 並在配置文件中添加以下行。

import gevent.monkey
gevent.monkey.patch_all()

有關更多詳細信息,您可以參考此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM