celery4+django2定时任务
网上有很多celery + django实现定时任务的教程,不过它们大多数是基于djcelery + celery3的; 或者是使用django_celery_beat配置较为繁琐的。 显然简洁而高效才是我们最终的追求,而celery4已经不需要额外插件即可与django结合实现定时任务了,原生的celery beat就可以很好的实现定时任务功能。 当然使用原生方案的同时有几点插件所带来的好处被我们放弃了:
在进行配置前先来看看项目结构: . ├── linux_news │?? ├── celery.py │?? ├── __init__.py │?? ├── settings.py │?? ├── urls.py │?? └── wsgi.py ├── manage.py ├── news │?? ├── admin.py │?? ├── apps.py │?? ├── __init__.py │?? ├── migrations │?? ├── models │?? ├── tasks.py │?? ├── tests.py │?? └── views └── start-celery.sh 其中news是我们的app,用于从一些rss订阅源获取新闻信息,linux_news则是我们的project。我们需要关心的主要是,,和。 首先是celery.py,想让celery执行任务就必须实例化一个celery app,并把settings.py里的配置传入app: import os from celery import Celery 配置就是这么简单,为了能在django里使用这个app,我们需要在__init__.py中导入它: from .celery import app as celery_app 然后我们来看tasks.py,它应该位于你的app目录中,前面我们配置了自动发现,所以celery会自动找到这些tasks,我们的tasks将写在这一模块中,代码涉及了一些orm的使用,为了契合主题我做了些精简: from linux_news.celery import celery_app as app from .models import * import time import feedparser import pytz import html tasks里是一些耗时操作,比如网络IO或者数据库读写,因为我们不关心任务的返回值,所以使用 任务配置完成后我们就要配置celery了,我们选择redis作为任务队列,我强烈建议在生产环境中使用rabbitmq或者redis作为任务队列或结果缓存后端,而不应该使用关系型数据库: # redis REDIS_PORT = 6379 REDIS_DB = 0 # 从环境变量中取得redis服务器地址 REDIS_HOST = os.environ.get('REDIS_ADDR','redis') 然后是我们的定时任务设置: from celery.schedules import crontab CELERY_BEAT_SCHEDULE={ 'fetch_news_every-1-hour': { 'task': 'news.tasks.fetch_all_news','schedule': crontab(minute=0,hour='*/1'),} } 定时任务配置对象是一个dict,由任务名和配置项组成,主要配置想如下:
配置完成后只需要启动celery了。 启动之前配置一下环境。不要用root运行celery!不要用root运行celery!不要用root运行celery!重要的事情说三遍。 start-celery.sh: export REDIS_ADDR=127.0.0.1 -A 表示app所在的目录,-B表示启动celery beat运行定时任务。 celery正常启动后就可以通过日志来查看任务是否正常运行了: [2018-12-21 13:00:00,022: INFO/MainProcess] Received task: news.tasks.fetch_all_news[e4566ede-2cfa-4c19-b2f3-0c7d6c38690d] [2018-12-21 13:00:00,046: INFO/MainProcess] Received task: news.tasks.fetch_news[583e96dc-f508-49fa-a24a-331e0c07a86b] [2018-12-21 13:00:00,051: INFO/ForkPoolWorker-2] Task news.tasks.fetch_all_news[e4566ede-2cfa-4c19-b2f3-0c7d6c38690d] succeeded in 0.02503809699555859s: None [2018-12-21 13:00:00,052: INFO/MainProcess] Received task: news.tasks.fetch_news[c61a3e55-dd3c-4d49-8d6d-ca9b1757db25] [2018-12-21 13:00:00,449: INFO/ForkPoolWorker-5] Task news.tasks.fetch_news[c61a3e55-dd3c-4d49-8d6d-ca9b1757db25] succeeded in 0.39487219898728654s: None [2018-12-21 13:00:00,606: INFO/ForkPoolWorker-3] Task news.tasks.fetch_news[583e96dc-f508-49fa-a24a-331e0c07a86b] succeeded in 0.5523456179944333s: None 以上就是celery4运行定时任务的内容,如有错误和疏漏,欢迎指正。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |