Django仅加载对象实例一次,在应用启动时可用

5 投票
3 回答
752 浏览
提问于 2025-04-18 03:37

我有一个应用程序(Django 1.6),里面大约有4000个对象,这些对象是之前生成的,用于自然语言处理(NLP)。

所有的应用程序流程(请求、测试、自定义管理命令等)都需要以某种方式使用这些对象。

我想做的是在启动的时候只加载一次这些对象,然后把它们存储在内存中,以便所有的应用程序流程都能使用。

这篇文章提供了一些线索,但我很想听听你们的想法,关于这种情况最好的处理方法是什么。

补充说明:这4000个对象在所有流程中只是用来读取,并不会在应用程序中被修改。

非常感谢!

3 个回答

0

你可以使用Redis。这个Python客户端运行得很好,可能你还可以用rom,这个工具看起来很适合用来建模你的数据。需要说明的是:我之前用过Redis,但从来没用过rom,最近几天才发现这个工具,觉得值得分享给大家。

祝你好运!

0

在这种情况下,最好的办法可能是专门启动一个进程来处理这些事情。其他方法可能会导致你在不同的部署集群中,无法保证对象是唯一的。

如果你使用独立的进程工作者来部署,那么每个进程都会有自己的一份NLP数据,这样就会有多个不同的副本。如果你使用协作线程(比如用gunicorn的gevent工作者),那么你需要确保你的代码是线程安全的,也就是说多个线程同时使用时不会出问题。

我建议把这个设置成一个外部服务,运行在专门的进程上,然后让每个客户端通过你选择的进程间通信方式(比如套接字、HTTP等)来访问这个服务。

在本地开发、测试和方便部署时,你可以选择把这些对象加载到项目的设置中。

1

你可能想把所有的数据放到缓存里,同时利用Memcached这个缓存工具。这样的话,你的程序就可以快速、安全、方便地访问这些数据。

撰写回答