使用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>;`

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java CXF和授权   java在网站中部署使用swing创建的表单   java为什么getHeaderField()返回一个字符串,其中getHeaderFields()返回HttpUrlConnection中的Map<String,List<String>>   java如何检测恶意数据包?   webview中的java网页为空   java SWT图像资源,用于将我的所有图像存储在一个位置   java计算数组的最大长度,使平均值小于给定值   java“发件人电话号码无效”和美国号码   将Swing组件作为内容的自定义Java工具提示不会显示   在并发HashMap中重新灰化期间的java检索   Java 7和Tomcat 7.0.64 ClassFormatException:常量池中的字节标记无效   使用JUnit的java assertNull因NullPointerException失败   java内存中的文件是否与文件系统中的文件大小相同?   循环内实例化的类型的java注入依赖项