uwsgi启动和python manager.py runserver启动
来源:6-5 数据库操作规范
![](http://img1.sycdn.imooc.com/user/545847c10001f40702200220-100-100.jpg)
慕798262113
2019-02-02
老师你好。
业务需要,
我需要预先加载一些类
但这些类初始化的时间就需要2-3秒。
我将这些类初始化后的结果写到了全局变量里,settings里,还有在views.py的最上边。
我发现
我python manage.py runserver 是没问题的,节省了很多的时间
(内存很大,便宜,不考虑占用内存问题)
但是
uwsgi --ini uwsgi的配置文件启动
每次请求来了,才会加载这些类
搜索引擎查找问题答案,
发现
两种启动方式 加载各模块的执行顺序是不同的。
uwsgi 请求到来后,才会加载urls views
预热请求一次后,才会加载到内存中了,但是过段时间会没有的,应该是uwsgi重启了那个进程。
我是需要预加载的东西,写到wsgi.py里?
这个感觉不太好,不知道能不能解决我的问题。
说的可能不太清晰,
就是
加载一个变量A = dlib.get-frontal-face-deterctor
加载 应该 变量B = dlib.shape-predictor('xxx.dat')
然后views里会有引用,提前加载 会节省很多时间
因为wsgi启动的特性,导致该进程的第一次请求会很慢。
1回答
-
咚咚呛
2019-02-02
这里问题描述的很详细,我先按自己的理解简单梳理下:
Django服务启动需要2-3s预加载数据
使用runserver方式启动可以预热数据,不影响请求
使用uWSGI部署后,Django进程会被频繁重启和预热数据,导致接口请求时长不稳定
基于以上我对问题的理解,提出几点建议,可供参考:
预热数据的问题
按照给出上面提到的是dat后缀的文件,我假设这是一个结构化的数据文件。那么在这里,我不建议在启动的时候使用2-3s加载这个文件,也不建议在wsgi接口文件进行导入。如果是不常变动的数据文件,可以通过抽象成表结构,提前导入到数据库。如果是常变动的数据文件,还应该为其增加CURD操作的接口。
uWSGI部署频繁重启Django进程
这个问题才是导致以上问题的根源,正常部署而言,Django进程是不会频繁重启的,解决这个才是解决以上问题最根本的方法,所以在这里我们需要解决为什么uWSGI部署后会频繁重启Django进程。
但这个没有相关日志参考,没办法做过多分析。按照过往经验做一个猜测:这里可能的一个原因是uWSGI对进程内存的限制和Django服务本身使用内存的冲突而导致的频繁重启。题主可以按照这个思路继续追踪一下问题,或者提供更多的日志记录,给做个参考。
希望对你有所帮助。
20
相似问题