最近工作中遇到一个问题,需要做定时任务,以前的定时任务我都是采用的crontab方案,但是新来的项目经理显然是不太满意这个解决方案的,这不他用了celery,虽然他没有强制我使用celery,但是我尽量还是使用 celery吧,废话不多说,直接百度一篇博客来学习。celery定时任务简单使用_数据库_Shyllin的博客-CSDN博客blog.csdn.net
这里在简书上找到一篇分享的celery4.1中文文档翻译,写的非常详细,有时间可以看看Celery4.1中文文档【翻译】www.jianshu.com
Celery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列
使用celery实现定时任务有4个步骤:创建一个Celery实例
配置文件中配置任务,发布调度器 (celery -A 项目名称 beat)
启动celery woker
存储结果
Celery定时任务详情:目录结构:(采用的是pycharm编辑器,可能会有所不同,但是大同小异)
─celery_task
│ celery.py
│ celeryconfig.py
│ REDEME
│ __init__.py
│
├─.idea
│ │ celery_task.iml
│ │ misc.xml
│ │ modules.xml
│ │ vcs.xml
│ │ workspace.xml
│ │
│ └─inspectionProfiles
├─app_scriptsk
│ │ task1.py
│ │ task2.py
│ │ __init__.py
│ │
│ └─__pycache__
│ task1.cpython-37.pyc
│ task2.cpython-37.pyc
│ __init__.cpython-37.pyc
│
└─__pycache__
celery.cpython-37.pyc
celeryconfig.cpython-37.pyc
__init__.cpython-37.pyc
1、celeryconfig配置文件
#!/usr/bin/python
# -*- coding: utf-8 -*-
from __future__ import absolute_import # 拒绝隐式引入,因为celery.py的名字和celery的包名冲突,需要使用这条语句让程序正确地运行
from celery.schedules import crontab
# 消息中间件 Broker
# Broker ,即为任务调度队列,接收任务生产者发来的消息(即任务),将任务存入队列
broker_url = "redis://127.0.0.1:6379/2" # 使用redis存储任务队列
# Backend 用于存储任务的执行结果,以供查询。
# 同消息中间件一样,存储也可使用 RabbitMQ, Redis 和 MongoDB 等。
result_backend = "redis://127.0.0.1:6379/6" # 使用redis存储结果
# 指定任务序列化方式
task_serializer = 'json'
# 指定结果序列化方式
result_serializer = 'json'
# 指定任务接受的序列化类型.
accept_content = ['json']
timezone = "Asia/Shanghai" # 时区设置
worker_hijack_root_logger = False # celery默认开启自己的日志,可关闭自定义日志,不关闭自定义日志输出为空
result_expires = 60 * 60 * 24 # 存储结果过期时间(默认1天)
# 导入任务所在文件
imports = [
"celery_task.app_scripts.task1", # 导入py文件
"celery_task.app_scripts.task2",
]
# 需要执行任务的配置
beat_schedule = {
"task1": {
"task": "celery_task.app_scripts.task1.celery_run", #执行的函数
"schedule": crontab(minute="*/1"), # every minute 每分钟执行
"args": () # # 任务函数参数
},
"task2": {
"task": "celery_task.app_scripts.task2.celery_run",
"schedule": crontab(minute=0, hour="*/1"), # every minute 每小时执行
"args": ()
},
}
# "schedule": crontab()与crontab的语法基本一致
# "schedule": crontab(minute="*/10", # 每十分钟执行
# "schedule": crontab(minute="*/1"), # 每分钟执行
# "schedule": crontab(minute=0, hour="*/1"), # 每小时执行
celery初始化文件:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# 拒绝隐式引入,因为celery.py的名字和celery的包名冲突,需要使用这条语句让程序正确地运行
from __future__ import absolute_import
from celery import Celery # (这里编辑器会飘红,但是没关系,还是可以正常运行)
# 创建celery应用对象
app = Celery("celery_demo")
# 导入celery的配置信息
app.config_from_object("celery_task.celeryconfig")
task1.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from celery_task.celery import app
def test11():
print("test11----------------")
def test22():
print("test22--------------")
test11()
@app.task
def celery_run():
test11()
test22()
return "task1"
if __name__ == '__main__':
celery_run()
task2.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
from celery_task.celery import app
def test33():
print("test33----------------")
# print("------"*50)
def test44():
print("test44--------------")
# print("------" * 50)
test33()
@app.task
def celery_run():
test33()
test44()
return "task2"
if __name__ == '__main__':
celery_run()
发布任务
H:\coding>celery -A celery_task beat
celery beat v4.3.0 (rhubarb) is starting.
__ - ... __ - _
LocalTime -> 2020-03-14 23:54:06
Configuration ->
. broker -> redis://127.0.0.1:6379/2
. loader -> celery.loaders.app.AppLoader
. scheduler -> celery.beat.PersistentScheduler
. db -> celerybeat-schedule
. logfile -> [stderr]@%WARNING
. maxinterval -> 5.00 minutes (300s)
执行任务
H:\coding>celery -A celery_task worker -l info -P eventlet
-------------- celery@PC-20180730NMQX v4.3.0 (rhubarb)
---- **** -----
--- * *** * -- Windows-7-6.1.7601-SP1 2020-03-14 23:54:24
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app: celery_demo:0x4d406d8
- ** ---------- .> transport: redis://127.0.0.1:6379/2
- ** ---------- .> results: redis://127.0.0.1:6379/6
- *** --- * --- .> concurrency: 4 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery
[tasks]
. celery_task.app_scripts.task1.celery_run
. celery_task.app_scripts.task2.celery_run
[2020-03-14 23:54:25,009: INFO/MainProcess] Connected to redis://127.0.0.1:6379/2
[2020-03-14 23:54:25,024: INFO/MainProcess] mingle: searching for neighbors
[2020-03-14 23:54:26,071: INFO/MainProcess] mingle: all alone
[2020-03-14 23:54:26,095: INFO/MainProcess] celery@PC-20180730NMQX ready.
以上就说明定时任务已经正常运行了。
遇到的问题,如果出现以下问题:
H:\coding>celery -A celery_task beat
celery beat v4.3.0 (rhubarb) is starting.
ERROR: Pidfile (celerybeat.pid) already exists.
Seems we're already running? (pid: 12820)
解决方案:
在celery_task的同级目录下找到以下文件,并且直接删除。
源码下载:码云链接gitee.com