使用gevent向django添加db连接池
django-db-geventpool的Python项目详细描述
django db geventpool
===========
图片::http://img.shields.io/travis/jneight/django db geventpool.svg
:目标:https://travis ci.org/jneight/django db geventpool
:alt:travis
。图片::https://img.shields.io/pypi/v/django db geventpool.svg
:目标:https://pypi.python.org/pypi/django db geventpool
:alt:pypi版本
。图片::http://img.shields.io/pypi/l/django db gevent pool.svg
:target:https://pypi.python.org/pypi/django db geventpool
:alt:pypi license
=1.6)*
python 3受支持,但如果"gevent"安装不成功,它将使用"eventlet"。
--
*``psycopg2>;=2.5.1``用于cpython 2和3(或"psycopg2 binary<;https://pypi.org/project/psycopg2 binary/>;`-请参阅"psycopg2 2.7.4发行版中的说明"<;http://initd.org/psycopg/articles/2018/02/08/psycopg-274-released/>;````````psycopg2cffi>;=2.7``对于pypy
patch psycopg2
----
psycopg2必须使用psycogreen进行修补,如果您使用的是"gunicorn webserver"<;http://www.gunicorn.org/>;`,
一个好地方是配置文件中的"post戋u fork"<;http://docs.gunicorn.org/en/latest/settings.html ` ` post fork>;` `函数:
。代码::python
from psycogreen.gevent import patch_psycopg如果使用来自psycogreen的gevent workers
,请使用此命令。eventlet import patch_psycopg如果使用eventlet workers
def post_fork(服务器,worker):
patch_psycopg()
worker.log.info("made psycopg2 green")
-
+在数据库设置中将*engine*设置为:
+*'django_db_geventpool.backends.postgresql_psycopg2'*
+对于postgis:*"django_db_geventpool.backends.postgis"*
+add*max_conns*to*options*设置允许到数据库的最大连接数(默认值=4)
+如果使用django 1.6或更高版本,则将*conn_max_age":0*添加到设置以禁用默认django永久连接功能。如果要手动生成greenlets
,请阅读下面的注释。代码::python
#未与sqlite3一起使用。
"密码":"postgres";"未与sqlite3一起使用。
"主机":","设置为本地主机的空字符串。未与sqlite3一起使用。
"端口":",默认设置为空字符串。不与sqlite3一起使用。
"选项":{
"最大连接":20
}
}
}
否则连接将永远不会返回池
数据库={
"默认":{
"引擎":"django-db-geventpool.backends.postgresql-psycopg2",
"名称":"db",
"用户":"postgres",
"密码":"postgres",
"主机":",
"端口":",
"原子请求":false,
"连接最大年龄":0,
"选项":{
"最大连接":20
}
}
}
足以将conn_max_age设置为0。
django仅在以下情况下检查长时间连接完成一个请求-因此,如果您手动生成一个greenlet(或让一个任务生成一个greenlet),那么它的连接将
不会被清理,并且将一直存在到超时。在生产中,这可能会导致相当多的连接打开,而在开发时,这可能会妨碍您的测试用例。
若要解决此问题,请确保每个greenlet在结束之前发送django.core.signals.request_finished信号或调用django.db.close_old_connections()。装饰方法是首选方法,但其他方法也有效。
…代码::python
from django_db_geventpool.utils import close_connection
@close_connection
def greenlet_worker()
…
代码::来自django.core.signals的python
代码::来自django.db的python
`
*`django postgresql<;https://github.com/kennethreitz/django postgrespool>;`
===========
图片::http://img.shields.io/travis/jneight/django db geventpool.svg
:目标:https://travis ci.org/jneight/django db geventpool
:alt:travis
。图片::https://img.shields.io/pypi/v/django db geventpool.svg
:目标:https://pypi.python.org/pypi/django db geventpool
:alt:pypi版本
。图片::http://img.shields.io/pypi/l/django db gevent pool.svg
:target:https://pypi.python.org/pypi/django db geventpool
:alt:pypi license
=1.6)*
python 3受支持,但如果"gevent"安装不成功,它将使用"eventlet"。
*``psycopg2>;=2.5.1``用于cpython 2和3(或"psycopg2 binary<;https://pypi.org/project/psycopg2 binary/>;`-请参阅"psycopg2 2.7.4发行版中的说明"<;http://initd.org/psycopg/articles/2018/02/08/psycopg-274-released/>;````````psycopg2cffi>;=2.7``对于pypy
patch psycopg2
----
psycopg2必须使用psycogreen进行修补,如果您使用的是"gunicorn webserver"<;http://www.gunicorn.org/>;`,
一个好地方是配置文件中的"post戋u fork"<;http://docs.gunicorn.org/en/latest/settings.html ` ` post fork>;` `函数:
。代码::python
from psycogreen.gevent import patch_psycopg如果使用来自psycogreen的gevent workers
,请使用此命令。eventlet import patch_psycopg如果使用eventlet workers
def post_fork(服务器,worker):
patch_psycopg()
worker.log.info("made psycopg2 green")
-
+在数据库设置中将*engine*设置为:
+*'django_db_geventpool.backends.postgresql_psycopg2'*
+对于postgis:*"django_db_geventpool.backends.postgis"*
+add*max_conns*to*options*设置允许到数据库的最大连接数(默认值=4)
+如果使用django 1.6或更高版本,则将*conn_max_age":0*添加到设置以禁用默认django永久连接功能。如果要手动生成greenlets
,请阅读下面的注释。代码::python
#未与sqlite3一起使用。
"密码":"postgres";"未与sqlite3一起使用。
"主机":","设置为本地主机的空字符串。未与sqlite3一起使用。
"端口":",默认设置为空字符串。不与sqlite3一起使用。
"选项":{
"最大连接":20
}
}
}
否则连接将永远不会返回池
数据库={
"默认":{
"引擎":"django-db-geventpool.backends.postgresql-psycopg2",
"名称":"db",
"用户":"postgres",
"密码":"postgres",
"主机":",
"端口":",
"原子请求":false,
"连接最大年龄":0,
"选项":{
"最大连接":20
}
}
}
足以将conn_max_age设置为0。
django仅在以下情况下检查长时间连接完成一个请求-因此,如果您手动生成一个greenlet(或让一个任务生成一个greenlet),那么它的连接将
不会被清理,并且将一直存在到超时。在生产中,这可能会导致相当多的连接打开,而在开发时,这可能会妨碍您的测试用例。
若要解决此问题,请确保每个greenlet在结束之前发送django.core.signals.request_finished信号或调用django.db.close_old_connections()。装饰方法是首选方法,但其他方法也有效。
…代码::python
from django_db_geventpool.utils import close_connection
@close_connection
def greenlet_worker()
…
代码::来自django.core.signals的python
代码::来自django.db的python
`
*`django postgresql<;https://github.com/kennethreitz/django postgrespool>;`