Django 中的 MaxMind GeoIP2 单实例
MaxMind GeoIP2 single instance in Django
我正在为 MaxMind 的 GeoIP 数据库使用 python 包装器 'geoip2'。文档中说你应该只创建数据库的单个实例 reader,因为打开数据库非常昂贵,而且,当然,为每个请求打开它是一个非常糟糕的主意。
那么,如果我的服务器上有 Django (1.10) + Gunicorn,我应该如何创建数据库 reader 的 "singleton"?这通常不是关于 geoip2 模块的问题,而是关于:
的问题
我应该如何创建一个可从应用程序访问的对象(不是
整个项目)?在 __init__
: os.environ['APP_VAR_WHATEVER'] = InitObject()
中做这样的事情可以吗?
可惜我对Gunicorn了解不多,所以第二个
问题是:工人能活多久?是不是每 N 重启一次
minutes/seconds?我问这个问题是因为我担心如果
过于频繁地重生工人,这会产生额外的不需要的东西
系统负载。
- 正如您提到的,您可以实现单例模式以便只有一个数据库 reader 应该将数据库缓存在内存中以加快查询速度(例如,查询成本更低)字典而不是数据库对象)。
- Gunicorn worker 保持不活动状态超过几秒(默认为 30 秒),但如果您的 worker 长时间保持沉默而您不这样做,您可以配置 timeout 值来满足您的需求不想让它经常重启。
这里http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html是单例模式的一个有用的例子
我正在为 MaxMind 的 GeoIP 数据库使用 python 包装器 'geoip2'。文档中说你应该只创建数据库的单个实例 reader,因为打开数据库非常昂贵,而且,当然,为每个请求打开它是一个非常糟糕的主意。
那么,如果我的服务器上有 Django (1.10) + Gunicorn,我应该如何创建数据库 reader 的 "singleton"?这通常不是关于 geoip2 模块的问题,而是关于:
的问题我应该如何创建一个可从应用程序访问的对象(不是 整个项目)?在
__init__
:os.environ['APP_VAR_WHATEVER'] = InitObject()
中做这样的事情可以吗?可惜我对Gunicorn了解不多,所以第二个 问题是:工人能活多久?是不是每 N 重启一次 minutes/seconds?我问这个问题是因为我担心如果 过于频繁地重生工人,这会产生额外的不需要的东西 系统负载。
- 正如您提到的,您可以实现单例模式以便只有一个数据库 reader 应该将数据库缓存在内存中以加快查询速度(例如,查询成本更低)字典而不是数据库对象)。
- Gunicorn worker 保持不活动状态超过几秒(默认为 30 秒),但如果您的 worker 长时间保持沉默而您不这样做,您可以配置 timeout 值来满足您的需求不想让它经常重启。
这里http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html是单例模式的一个有用的例子