celery 定時任務(wù)實現(xiàn)

Celery 是什么?

  • 異步任務(wù)隊列工具,主要解決 realtime 事件的異步操作接箫,但也支持定時任務(wù)泰鸡。
  • 什么是異步?那要先理解什么是同步,比如我去麥當(dāng)勞吃飯,如果麥當(dāng)勞前一個顧客點完單,拿到餐抗悍,吃完走人之后才能接待下一個顧客,就是同步钳枕。反過來我點完單缴渊,它馬上就接下一個客人的單,我的流程雖然還沒有走完(time-consuming)鱼炒,但也不影響下一個顧客點單(blocked)衔沼,這就是異步。

Celery 安裝

  • pip install celery昔瞧,由于 celery 自己并不帶隊列存儲指蚁,所以根據(jù)官方推薦,還需要安裝 RabbitMQ 或者 Redis 來存儲隊列自晰。方便起見凝化,本文用 Redis。

Celery 機制

  1. celery 是一個裝飾器類酬荞,本質(zhì)上是把一個函數(shù)變成一個可以異步調(diào)用的函數(shù)搓劫。
  2. 開啟 celery 進程。
  3. 在另一段程序中導(dǎo)入這個函數(shù)混巧,當(dāng)這個函數(shù)被以 delay 模式調(diào)用時:xxx.delay()枪向,celery 會把這個任務(wù)寫到任務(wù)隊列然后返回,原程序不會被阻塞可以往下跑咧党。注意這里需要用 delay 模式去跑這個函數(shù)秘蛔,同時注意不要把 xxx.delay() 的結(jié)果賦值給一個變量,否則依然會被阻塞。
  4. celery 的另一個進程會去這個任務(wù)隊列里取任務(wù)缠犀,完成之后寫到 result 隊列里面数苫〈鲜妫或者多數(shù)情況下辨液,這個被異步調(diào)用的函數(shù)不需要返回結(jié)果,比如發(fā)送一個郵件箱残,提醒之類的滔迈,連 result 隊列都不用。

Celery first blood

  1. 開一個 python 腳本被辑,比如tasks.py燎悍。

  2. 生成一個 Celery 對象實例,是一個裝飾器盼理。

    from celery import Celery
    app = Celery('__name__', broker='redis://localhost:6379') 
    
  3. 定義一個你想異步操作的函數(shù)谈山,并加上 celery 裝飾器 @app.task

    @app.task
    def add(x, y):
        return x + y
    
  4. 保存宏怔,退出奏路,然后在 terminal 啟動 celery 服務(wù)。

    celery -A tasks worker --loglevel=info
    

做個定時任務(wù):每天發(fā)問候

  1. 接下來臊诊,我要搭配釘釘機器人了鸽粉,我希望小仙女每天早上7點給我發(fā)個問候,然后在7點半的時候確認(rèn)我有沒有開始干活了抓艳。

  2. 先寫一個簡單的釘釘提醒程序触机,命名celery_worker.py

    #! /usr/bin/env python
    # coding: utf-8
    
    import requests
    import json
    import time
    
    from config import HOST_IP, NOTIFY_URL, MOBILE_NUMBER
    
    def notify_dingding(msg):
        headers = {"Content-Type": "application/json; charset=utf-8"}
        post_data = {
            "msgtype": "text",
            "text": {
                "content": msg
            },
            "at": {
                "atMobiles": [MOBILE_NUMBER]
            }
        }
    
        r = requests.post(NOTIFY_URL, headers=headers, data=json.dumps(post_data))
        print(r.content)
    

    注意這里從 config 里導(dǎo)入了一些參數(shù),所以要在這個程序的同一層寫一個 config.py 的配置文件玷或。

    # config.py
    NOTIFY_URL = ("https://oapi.dingtalk.com/robot/send?access_token="
        "c6d5a2936381dfc29394f3c336bea5fad962d90ffd31809e92d95a1xxxxxxxx")
    MOBILE_NUMBER = "176xxxxx619"
    HOST_IP = "127.0.0.1"
    
  3. 導(dǎo)入 celery 包儡首,給函數(shù)加上裝飾器:

    from celery import Celery
    
    BROKER_URI = 'redis://%s:6379/6' % HOST_IP
    BACKEND_URI = 'redis://%s:6379/5' % HOST_IP
    
    worker = Celery('celery_worker', broker=BROKER_URI, backend=BACKEND_URI)
    
    @worker.task
    def notify_dingding(msg):
        ...
    
  4. 簡單學(xué)習(xí)一下celery 的 crontab 定時任務(wù)

  5. 給 worker 加上定時任務(wù)

    from celery.schedules import crontab
    
    worker.conf.update(
        timezone='Asia/Shanghai',
        enable_utc=True,
        beat_schedule={
            "morning_msg_1": {
                "task": "celery_worker.notify_dingding",
                "schedule": crontab(minute=0, hour=7),
                "args": ("早偏友,起床了喲蔬胯,先去做個早飯吧",)
            },
            "morning_msg_2": {
                "task": "celery_worker.notify_dingding",
                "schedule": crontab(minute=30, hour=7),
                "args": ("我就問問你在干活咩?",)
            }
        }
    )
    
  6. 最后程序末尾加一個小測試,看看服務(wù)是不是起來了:

    notify_dingding("小仙女上線啦")
    
  7. 開啟 redis-server

    nohup redis-server &
    
  8. 開啟我們的 celery worker约谈,這里的-B 是 celery 的 beat 服務(wù)笔宿,可以理解為一個周期任務(wù)。

    celery -A celery_worker worker -B
    
  9. 服務(wù)起來嘍:

QQ20170818-163110.jpg
QQ20170818-162958.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末棱诱,一起剝皮案震驚了整個濱河市泼橘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迈勋,老刑警劉巖炬灭,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異靡菇,居然都是意外死亡重归,警方通過查閱死者的電腦和手機米愿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼻吮,“玉大人育苟,你說我怎么就攤上這事∽的荆” “怎么了违柏?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長香椎。 經(jīng)常有香客問我漱竖,道長,這世上最難降的妖魔是什么畜伐? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任馍惹,我火速辦了婚禮,結(jié)果婚禮上玛界,老公的妹妹穿的比我還像新娘万矾。我一直安慰自己,他們只是感情好脚仔,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布勤众。 她就那樣靜靜地躺著,像睡著了一般鲤脏。 火紅的嫁衣襯著肌膚如雪们颜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天猎醇,我揣著相機與錄音窥突,去河邊找鬼。 笑死硫嘶,一個胖子當(dāng)著我的面吹牛阻问,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沦疾,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼称近,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了哮塞?” 一聲冷哼從身側(cè)響起刨秆,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忆畅,沒想到半個月后衡未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年缓醋,在試婚紗的時候發(fā)現(xiàn)自己被綠了如失。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡送粱,死狀恐怖褪贵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葫督,我是刑警寧澤竭鞍,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布板惑,位于F島的核電站橄镜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏冯乘。R本人自食惡果不足惜洽胶,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望裆馒。 院中可真熱鬧姊氓,春花似錦、人聲如沸喷好。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梗搅。三九已至禾唁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間无切,已是汗流浹背荡短。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哆键,地道東北人掘托。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像籍嘹,于是被迫代替她去往敵國和親闪盔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容