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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章