prosta aplikacja badawczej:Gunicorn + kolba + pymongo + gevent wisi na inicjalizacji
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()
działa idealnie jeśli jest uruchomiony jako samodzielna aplikacja:
[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
Ale nie uruchomi się z 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
Niektóre uwagi:
- działa idealnie jeśli gevent jest wyłączony (małpa łatanie i gunicorn klasa pracownik)
- działa jeśli db obiekt jest tworzony za każde żądanie przychodzącego
- wersje: gevent 1.0, gunicron 18,0, pymongo 2.6.2 , kolba 0.9, python 2.6.5
Wątpię, czy jest to właściwy sposób na zainicjowanie i udostępnienie puli bazy danych. Nadal nie mogę znaleźć nigdzie, jeśli istnieje jakikolwiek inny sposób udostępniania obiektu między żądaniami.
Tak, widziałem, że już. To naprawdę bardzo podobne (to samo?). Rozwiązanie dostarczone w tym wydaniu tworzy MongoClient na żądanie. – Shcheklein