Celery定时任务
本文简述Celery定时任务,每天6点向指定邮箱发送笑话和一套斗图
知识点:
- 简单爬虫
- 发送邮件
- Celery定时任务
本项目 github : https://github.com/TimeAshore/Celery-QQTask
关于Celery学习,请查看这篇文章《Python异步任务之Celery》
项目目录结构图:
__init__.py
文件实例化Celery
#encoding: utf-8
# Author: Timeashore
from celery import Celery
cele = Celery('demo')
cele.config_from_object('celery_app.celeryconfig')
celeryconfig.py 配置Celery
#encoding: utf-8
# Author: Timeashore
from celery.schedules import crontab
# Broker and Backend
BROKER_URL = 'redis://127.0.0.1:6379'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379'
CELERY_TIMEZONE='Asia/Shanghai' # 指定时区,不指定默认为 'UTC'
# CELERY_TIMEZONE='UTC'
# import
CELERY_IMPORTS = (
'celery_app.task1',
)
# schedules
CELERYBEAT_SCHEDULE = {
'multiply-at-some-time': {
'task': 'celery_app.task1.send_email_image',
'schedule': crontab(hour=6, minute=20), # 每天早上 6 点 00 分执行一次
'args': () # 任务函数参数
}
}
task1.py 是定时任务文件,发送图片邮件部分代码:
content = MIMEText(con + '''<html><body><table>
<tr>
<td><img src="cid:imageid1"></td><td><img src="cid:imageid3"></td>
</tr>
<tr>
<td><img src="cid:imageid2"></td><td><img src="cid:imageid4"></td>
</tr>
<tr>
<td><img src="cid:imageid5"></td><td><img src="cid:imageid7"></td>
</tr>
<tr>
<td><img src="cid:imageid6"></td><td><img src="cid:imageid8"></td>
</tr>
</table></body></html>''', 'html', 'utf-8')
msg.attach(content)
for x in range(1, 9):
with open("{}.{}".format(x, point), "rb") as f:
img_data = f.read()
img = MIMEImage(img_data)
img.add_header('Content-ID', 'imageid{}'.format(str(x)))
msg.attach(img)
try:
s = smtplib.SMTP_SSL("smtp.qq.com", 465) # 邮件服务器及端口号
s.login(msg_from, passwd)
s.sendmail(msg_from, 收件人, msg.as_string())
print u"发送成功"
except Exception, e:
print u"发送失败", e.message
finally:
s.quit()
邮件使用 QQ 邮箱,前提需要开启账户 POP3 和 IMAP , 具体设置请看项目代码。
执行
1,在celery_app同级目录下,启动Celery worker 进程
celery -A celery_app worker --loglevel=info
启动成功如下图:
2,在celery_app同级目录下,开启定时任务,周期性的把 task 发送到 Broker
celery beat -A celery_app
如下图:
至此,部署到服务器。
完。
展示图:
同样的,按照这个思路,可以很简单的实现天气预报实时通知等。
任务执行时间
crontab(minute='*/1') # 每分钟
crontab(hour=6, minute=20) # 每天6::20
crontab(minute='30', hour='17', day_of_week='5') # 每周五17:30
crontab(minute=0, hour=0, day_of_month='5') # 每月5号0:00