当前位置:   article > 正文

uwsgi部署配置apscheduler随项目自动启动_uwsgi apscheduler

uwsgi apscheduler

django项目中使用了apscheduler的定时任务框架,开发阶段通过python manage.py runserver 0.0.0.0:8000启动项目时,apscheduler可以自动启动。但部署生产环境通过uwsgi启动项目,apscheduler定时任务没有随项目的启动而自动启动,当通过浏览器打开登录网页,定时任务才启动。

一、初始化启动任务代码

在__init__.py文件中编写任务初始化

# 初始化函数
def init_task():
    print('------------init_task---------------')
    try:
        # 加载任务
        load_task()
    except Exception as e:
        print('初始化任务失败: {}'.format(e))

# 单实例类:初始化
class SingleInitTask(object):
    _instance = None
    lock = Lock()

    def __new__(cls, *args, **kwargs):
        if not getattr(cls, '_instance', None):
            with cls.lock:  # 使用线程锁
                if not getattr(cls, '_instance', None):
                    cls._instance = super().__new__(cls)
                    init_task()
        return cls._instance
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

二、解决方法

通过baidu搜索,绝大多数人都是建议使用uwsgi的enable-threads参数,而 ini文件中已配置,如下:

command=uwsgi --socket 127.0.0.1:8000 --wsgi web.wsgi --enable-threads --home=/var/www/xxxinfo-manage/venv

最终找到合理的解释是:python manage.py 启动项目是通过manage.py驱动,而uwsgi启动通过wsgi.py驱动。故此需要将计划任务的视图文件放置在wsgi.py文件中,如下:

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web.settings')

application = get_wsgi_application()

from tasks import views as taskview
  • 1
  • 2
  • 3
  • 4
  • 5

参考网址:https://blog.wlzs.cn/nginx%E9%80%9A%E8%BF%87uwsgi%E5%8F%91%E5%B8%83django%E9%A1%B9%E7%9B%AE%E5%AF%BC%E8%87%B4apscheduler%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%E4%B8%8D%E8%87%AA%E5%8A%A8%E5%90%AF%E5%8A%A8/

三、启动效果截图

init-task

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/495978
推荐阅读
相关标签
  

闽ICP备14008679号