2014-04-07 9 views
6

semplice test app:Gunicorn + boccetta + pymongo + gevent pende su di inizializzazione

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() 

funziona perfettamente se è eseguito come applicazione stand-alone: ​​

[email protected]:~$ 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 

ma non riesce a iniziare con gunicorn:

[email protected]:~$ 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 

Alcune note:

  • funziona perfettamente se gevent è spento (scimmia patch e gunicorn classe operaia)
  • funziona se db oggetto viene creato per ogni richiesta in arrivo
  • versioni: gevent 1.0, gunicron 18.0, pymongo 2.6.2 , pallone 0.9, python 2.6.5

Dubito che questo sia un modo corretto per inizializzare e condividere un pool di database. Ancora, non riesco a trovare da nessuna parte se c'è un altro modo per condividere un oggetto tra le richieste.

risposta

0

Forse questo Gunicorn issue potrebbe fornire ulteriori informazioni e aiuto.

+0

Sì, ho visto che già. È davvero molto simile (lo stesso?). La soluzione fornita in tale numero crea MongoClient per richiesta. – Shcheklein