【问题标题】:Gunicorn+flask+pymongo+gevent hangs on initializationGunicorn+flask+pymongo+gevent 在初始化时挂起
【发布时间】:2014-04-07 09:29:40
【问题描述】:

简单的测试应用:

from gevent import monkey
monkey.patch_all()

from pymongo import Connection, MongoClient
from flask import Flask, make_response

app = Flask(__name__)
print "connect"
connection = MongoClient("host1, host2, host3", 27017, max_pool_size=4, **{"connectTimeoutMS": 3000, "socketTimeoutMS": 3000, "use_greenlets": True})
print "db"
db = connection.barn_2

@app.route('/')
def hello_world():
    return make_response("Hello world!", 200, {'Content-type': 'application/json; charset=UTF-8'})

if __name__ == '__main__':
    app.run()

如果它作为独立应用程序运行,则可以完美运行:

shcheklein@hostname:~$ python test.py
connect
db
 * Running on http://127.0.0.1:5000/
127.0.0.1 - - [07/Apr/2014 13:07:31] "GET / HTTP/1.1" 200 -
^CKeyboardInterrupt

但无法以 gunicorn 开头:

shcheklein@hostname:~$ gunicorn -w 1 -k gevent -t 5 --debug test:app
2014-04-07 13:15:04 [9752] [INFO] Starting gunicorn 18.0
2014-04-07 13:15:04 [9752] [INFO] Listening at: http://127.0.0.1:8000 (9752)
2014-04-07 13:15:04 [9752] [INFO] Using worker: gevent
2014-04-07 13:15:04 [9757] [INFO] Booting worker with pid: 9757
connect
2014-04-07 13:15:09 [9752] [CRITICAL] WORKER TIMEOUT (pid:9757)
2014-04-07 13:15:09 [9752] [CRITICAL] WORKER TIMEOUT (pid:9757)
2014-04-07 13:15:10 [9787] [INFO] Booting worker with pid: 9787
connect
2014-04-07 13:15:15 [9752] [CRITICAL] WORKER TIMEOUT (pid:9787)
2014-04-07 13:15:15 [9752] [CRITICAL] WORKER TIMEOUT (pid:9787)
2014-04-07 13:15:16 [9809] [INFO] Booting worker with pid: 9809
connect
2014-04-07 13:15:21 [9752] [CRITICAL] WORKER TIMEOUT (pid:9809)
2014-04-07 13:15:21 [9752] [CRITICAL] WORKER TIMEOUT (pid:9809)
2014-04-07 13:15:22 [9830] [INFO] Booting worker with pid: 9830

一些注意事项:

  • 如果 gevent 关闭(猴子补丁和 gunicorn 工人阶级),它会完美运行
  • 如果每个传入请求都创建 db 对象,它就可以工作
  • 版本:gevent 1.0、gunicron 18.0、pymongo 2.6.2、flask 0.9、python 2.6.5

我怀疑这是初始化和共享数据库池的正确方法。尽管如此,如果有任何其他方式可以在请求之间共享对象,我还是找不到任何地方。

【问题讨论】:

    标签: python flask pymongo gunicorn gevent


    【解决方案1】:

    好的,这与以下问题相同:

    https://jira.mongodb.org/browse/PYTHON-607

    对我有用的解决方法:

    from gevent import monkey
    monkey.patch_all()
    
    unicode('foo').encode('idna')
    
    ...
    

    或:

    shcheklein@hostname:~$ export GEVENT_RESOLVER=ares
    shcheklein@hostname:~$ gunicorn -w 1 -k gevent -t 5 --debug test:app
    

    【讨论】:

      【解决方案2】:

      也许这个 Gunicorn issue 可以为您提供一些额外的信息和帮助。

      【讨论】:

      • 是的,我已经看到了。它确实非常相似(相同?)。该问题中提供的解决方案为每个请求创建 MongoClient。
      猜你喜欢
      • 2015-02-25
      • 2012-11-13
      • 1970-01-01
      • 2017-06-23
      • 2021-08-29
      • 2019-10-09
      • 2014-05-02
      • 2021-06-22
      相关资源
      最近更新 更多