记录usgi +APScheduler 部署遇到的系列问题

本文记录了一个自动化运维项目中使用APScheduler进行定时任务时遇到的问题。在本地测试中,由于runserver的多进程特性导致单例模式失效,定时任务执行两次。在Nginx + uWSGI + Django部署后,通过将启动定时任务的命令放在wsgi.py中解决了任务未启动的问题,但随后发现任务被执行多次。经过调整uWSGI配置并启用文件锁,解决了执行多次的问题,却又遇到请求长时间pending的情况。最终通过调整uWSGI配置和使用start_timer.py成功解决问题,但仍对某些原理不甚了解,期待进一步研究。
摘要由CSDN通过智能技术生成

公司做的一个自动化运维项目,有一个需求是定时任务执行。前面的同事采用的是APScheduler的backgroundscheduler。由于是采用多线程来执行,为了防止多个对象来操作定时任务,造成定时任务多次执行的问题,采用单例模式来处理这个问题。代码比较简单,如下:

from functools import wraps

def singleton(cls,*args,**kwargs):
    isinstance={}

    @wraps(cls)
    def _singleton():
        if cls not in isinstance:
            isinstance[cls]=cls(*args,**kwargs)
        return isinstance[cls]
    return _singleton

但是在本地直接runserver 测试的时候,会发现定时任务每次执行了两次,后面发现,runserver 默认情况会起一个进程来监控代码的变更,而多进程下,单例模式是无法起作用的,所以需要在runserver 后面加上:

python3 manage.py runserver --noreload  # 这样就不会启动autoreload这个进程

本地测试没有问题,开始部署项目,采用的也是比较通用的Nginx + uwsgi + Django 这一套
部署完成之后发现,定时任务没有启动,排查原因,由于我们之前是通过manage.py来启动项目,而当用uwsgi来启动时,

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值