1. 程式人生 > >Celery+python+redis異步執行定時任務

Celery+python+redis異步執行定時任務

imp 技術分享 ret nts 博文 exe configure ber flow

我之前的一篇文章中寫了【Celery+django+redis異步執行任務】
博文:http://blog.csdn.net/apple9005/article/details/54236212
你會發現,這些代碼並不依賴django框架,隨便寫到一個py文件中,就可以輕松的執行成功,這是因為這些代碼並沒有用到django-celery,django-redis等依附於django框架的東西。
今天,參照官方文檔示例,測試一下celery的異步執行定時任務如何。我先是在django框架內執行了一遍,沒有問題;現在直接寫個py文件,命令行下執行試試

1.環境搭建

通過pip 安裝 celery、redis
pip install celery
pip install redis

默認安裝celery 最新版是4.0.2
默認安裝redis 最新版是2.10.5

另外不要忘記安裝redis服務:

# wget http://download.redis.io/releases/redis-3.2.6.tar.gz
# tar xzf redis-3.2.6.tar.gz
# cd redis-3.2.6
# make
# src/redis-server   # 啟動redis服務,看清楚,這是在你的redis-3.2.6目錄下執行的
# src/redis-cli   # 啟動客戶端

2.編寫py

直接vim搞起了

$ vim tesks.py
from celery import Celery
from celery.schedules import crontab

app = Celery(‘tasks‘, broker=‘redis://localhost:6379/0‘)

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test(‘hello‘) every 10 seconds.
    sender.add_periodic_task(10.0, test.s(‘hello‘), name=‘add every 10‘)

    # Calls test(‘world‘) every 30 seconds
    sender.add_periodic_task(30.0, test.s(‘world‘), expires=10)

    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s(‘Happy Mondays!‘),
    )

@app.task
def test(arg):
    print(arg)

按住shift鍵+Z+Z,保存文件並退出

3.在新命令窗口中啟動redis服務

怎麽啟動?
進入你的redis目錄

$ cd redis-3.2.6
$ src/redis-3.2.6

4.在新窗口中啟動celery

進入你tasks.py所在目錄,執行:

$ celery -A tasks worker --loglevel=info

此時,異步服務已經可用了,但定時任務並沒有執行,怎麽回事?你還需要再啟動另一服務,如下

5.在新窗口中啟動beat

還是要進入你tasks.py所在目錄,執行:

$ celery -A tasks beat

啟動後的樣子:
技術分享圖片
看一下第4步的窗口,是不是有打印輸出?good!每隔10秒打印一次hello,每隔30秒打印一次world!
技術分享圖片

具體你的項目要設置多長時間執行任務,可參見官方文檔的參數說明。
附官方文檔地址:http://docs.celeryproject.org/en/latest/

附:如何監控Celery?

並行處理框架Celery的Web監控管理服務-Flower
參見鏈接
https://my.oschina.net/u/2306127/blog/420929
http://flower-docs-cn.readthedocs.io/zh/latest/index.html

Celery+python+redis異步執行定時任務