请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

uwsgi启动和python manager.py runserver启动

老师你好。
业务需要,
我需要预先加载一些类
但这些类初始化的时间就需要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启动的特性,导致该进程的第一次请求会很慢。

正在回答 回答被采纳积分+3

1回答

咚咚呛 2019-02-02 23:25:51

这里问题描述的很详细,我先按自己的理解简单梳理下:

  1. Django服务启动需要2-3s预加载数据

  2. 使用runserver方式启动可以预热数据,不影响请求

  3. 使用uWSGI部署后,Django进程会被频繁重启和预热数据,导致接口请求时长不稳定

基于以上我对问题的理解,提出几点建议,可供参考:

  1. 预热数据的问题

    按照给出上面提到的是dat后缀的文件,我假设这是一个结构化的数据文件。那么在这里,我不建议在启动的时候使用2-3s加载这个文件,也不建议在wsgi接口文件进行导入。如果是不常变动的数据文件,可以通过抽象成表结构,提前导入到数据库。如果是常变动的数据文件,还应该为其增加CURD操作的接口。

  2. uWSGI部署频繁重启Django进程

    这个问题才是导致以上问题的根源,正常部署而言,Django进程是不会频繁重启的,解决这个才是解决以上问题最根本的方法,所以在这里我们需要解决为什么uWSGI部署后会频繁重启Django进程。

    但这个没有相关日志参考,没办法做过多分析。按照过往经验做一个猜测:这里可能的一个原因是uWSGI对进程内存的限制和Django服务本身使用内存的冲突而导致的频繁重启。题主可以按照这个思路继续追踪一下问题,或者提供更多的日志记录,给做个参考。


希望对你有所帮助。

2 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信