apscheduler

问题一:如何在Django服务开始时启动定时任务
在Django中准备使用APscheduler,最开始在wsgi模块里面开始一个

from apscheduler.schedulers.background import BackgroundScheduler

scheduler = BackgroundScheduler()

让Django在服务启动的时候就能产生scheduler这个服务。。
可是后来在业务模块已经写好了要调用的定时的api和scheduler.start()后,没有什么反应。直到后来,在urls.py这个模块里面要导入业务模块
才实现定时任务!

总结以往经验来猜想一下:Django服务启动第一步就是去加载wsgi这个模块,之后就开始去加载urls这个模块了。至于是否正确,只能以后再去研究,官网上也没有好好找!

——–分割线——–
好像urls.py模块也不行。我是在Django1.8的环境下弄得。今天又重新跑到wsgi模块去了

———分割线——
今天我在Mac试了下,使用python manage.py runserver这种命令居然在urls和wsgi都能实现。奇葩!

问题二:如何添加apscheduler的job到数据库里
最开始在配置的时候,我以为不能用msyql存储任务,后来发现 jobstores 中的SQLAlchemyJobStore 就可以实现,不仅仅是mysql,sqlite3也是共用这一套,
而且在配置的时候要注意怎么配(源码里面有详情):

'default':SQLAlchemyJobStore(url='mysql://root:[email protected]:3306/djangomysql'

因为要用apscheduler,所以装饰器肯定也要用:
找到两个网站的例子:
https://segmentfault.com/a/1190000004238416
http://python.jobbole.com/82344/

没有参数或者返回值

def deco(func):
    def _deco():
        print 'before invoked'
        func()
        print 'after invoked'
    return _deco

@deco
def f():
    print 'f is invoked'

如果被装饰的函数f带参数且有返回值

def deco(func):
    def _deco(*args, **kwargs):
        print 'before invoked'
        ret = func(*args, **kwargs)
        print 'after invoded'
        return ret
    return _deco

@deco
def f(a):
    print 'f is invoked'
    return a + 1

如果装饰器带有参数,需要多包一层,把参数调用包进去

def deco(*args):
    def _deco(func):
        def __deco(*args, **kwargs):
            print 'decorator args is', args
            print 'before invoked'
            ret = func(*args, **kwargs)
            print 'after invoded'
            return ret
        return __deco
    return _deco

@deco('test')
def f(a):
    print 'f is invoked'
    return a + 1

猜你喜欢

转载自blog.csdn.net/feixiaohuijava/article/details/78710279
今日推荐