设置中的Django文件描述符

ibps3vxo  于 2023-03-04  发布在  Go
关注(0)|答案(1)|浏览(169)

在我的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.如果应用程序失败,文件描述符将无法正确关闭。

  1. Django应用程序在内存中保存文件的最佳实践是什么?
icnyk63a

icnyk63a1#

1.不,不会有冲突。两个工作线程可以同时读取同一个文件。
1.如果您使用的是with,就可以了。
1.如果可能的话,不要把它们保存在内存中。
如果maxminddb模块可以避免的话,它不会将文件加载到内存中(参见文档)。您不应该在settings中打开它,而应该在您的视图中打开它。
你也可以在访问mmdb的代码上添加一个lru_cache decorator,这样每个worker将缓存最多128个最近使用的结果,当然,你也可以用Django缓存来代替它,在worker之间共享它。

@functools.lru_cache(maxsize=128)
def get_ip_info(ip):
    with maxminddb.open_database("GeoLite2-City.mmdb") as mmdb:
        return mmdb.get(ip)

def my_view(request):
    info = get_ip_info(...)
    return Response(
        {
            "city": info.city,
            "other": "some_other_information_about_ip",
        }
    )

相关问题