簡體   English   中英

Gunicorn RecursionError 與 gevent 和 python 3.6.2 中的請求

[英]Gunicorn RecursionError with gevent and requests in python 3.6.2

我有一個簡單的燒瓶腳本,它使用請求向第三方 Web 服務發出 http 請求。 我在 gunicorn 中運行腳本的方式是

gunicorn abc:APP -b 0.0.0.0:8080 -w 4 -k gevent --timeout 30 --preload

但是,在我將代碼升級到 python 3.6.2 后,我仍然可以運行服務器,但是每當網絡服務器收到請求時,它就會顯示

RecursionError: maximum recursion depth exceeded while calling a Python object

在每個工人身上,服務器似乎仍在運行。 當我將運行命令更改為

gunicorn abc:APP -b 0.0.0.0:8080 -w 4 --timeout 30 --preload

這一切都再次起作用。 那么gunicorn的異步工作者和python 3.6.2中的請求有什么問題嗎? 有沒有辦法來解決這個問題?

(這個問題也在https://github.com/benoitc/gunicorn/issues/1559提出)

這是因為ssl是在monkey patch之前導入的,gunicorn在加載config時會導入ssl模塊(gevent中的config.py),但是monkey patch是在初始化worker時或者app.py文件的頂部調用的,這肯定是導入 ssl 后,這就是我們收到警告的原因。

一個簡單的解決方案是使用 gunicorn 的配置文件。 我們可以在配置文件的開頭打gevent monkey patch,然后用配置文件啟動gunicorn,這樣就可以在import ssl之前完成monkey patch,從而避免這個問題。

名為 gunicorn_config.py 的配置文件可能包含以下行:

import gevent.monkey
gevent.monkey.patch_all()

workers = 8

然后我們可以開始 gunicorn

gunicorn --config config.py --worker-class gevent --preload -b 0.0.0.0:5000 app:app

更多信息可以在這里找到

請參閱https://github.com/benoitc/gunicorn/issues/1559 這可能會在下一版本的 gunicorn 中得到修復,但不幸的是,如果您不想破壞 gunicorn,您可能不得不繼續使用 python 3.5.2。

暫無
暫無

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

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