在我的Django项目中,我想使用MaxMind数据库文件来获取IP地址的信息。这个文件占用了90兆字节。我预计每秒大约有50个请求,而且应用程序将托管在Gunicorn上,有3个工作线程。那么,如果我每次请求都打开一个文件,我会满足限制吗?
with maxminddb.open_database('GeoLite2-City.mmdb') as mmdb:
info = mmdb.get('152.216.7.110')
return Response({'city': info.city, 'other': 'some_other_information_about_ip'})
还是应该在www.example.com中打开该文件settings.py一次:
mmdb = maxminddb.open_database('GeoLite2-City.mmdb')
在我的网站上使用这个描述views.py符
from django.conf import settings
....
info = settings.mmdb.get('152.216.7.110')
return Response({'city': info.city, 'other': 'some_other_information_about_ip'})
我关注几个问题:
1.如果两个工作线程同时读取文件,可能会发生冲突。
1.如果应用程序失败,文件描述符将无法正确关闭。
- Django应用程序在内存中保存文件的最佳实践是什么?
1条答案
按热度按时间icnyk63a1#
1.不,不会有冲突。两个工作线程可以同时读取同一个文件。
1.如果您使用的是
with
,就可以了。1.如果可能的话,不要把它们保存在内存中。
如果
maxminddb
模块可以避免的话,它不会将文件加载到内存中(参见文档)。您不应该在settings
中打开它,而应该在您的视图中打开它。你也可以在访问mmdb的代码上添加一个
lru_cache
decorator,这样每个worker将缓存最多128个最近使用的结果,当然,你也可以用Django缓存来代替它,在worker之间共享它。