在django中使用celery

简单记录celery在django中的目录结构及配置方式。

目录结构

my_project
	my_project
	my_apps
	manage.py
	my_celery
		__init__.py
		main.py
		conf.py
		msg_tasks
			__init__.py
			tasks.py
		mail_tasks
			__init__.py
			tasks.py
			
msg_tasks和mail_tasks目录下的tasks.py为固定命名方式,不能取其他名称。
main.py

import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
# 加载django的配置
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')

# 创建一个Celery对象,用于执行异步任务。proj为名称,可起任意名字。
app = Celery('proj')

# 加载自定义的celery配置文件
app.config_from_object('my_celery.conf')

# Load task modules from all registered Django app configs.
# 加载已创建的任务
app.autodiscover_tasks(['my_celery.mail_tasks', 'my_celery.msg_tasks'])
conf.py

# 采用redis1号数据库存储异步任务
broker_url = 'redis://127.0.0.1:6379/1'
# 采用redis2号数据库存储任务返回的数据
result_url = 'redis://127.0.0.1:6379/2'
# 更多配置可参考celery官方文档:
# https://docs.celeryproject.org/en/stable/userguide/configuration.html
mail_tasks.tasks.py

from my_celery.main import app
import time

@app.task
def send_mail(msg):
    time.sleep(3)
    print("发送邮件:{}".format(msg))



msg_tasks.tasks.py

from my_celery.main import app
import time

@app.task
def send_msg(msg):
    time.sleep(3)
    print("发送信息:{}".format(msg))
my_apps.views.py

from datetime import datetime, timedelta, timezone

class CeleryTaskView(APIView):

    def get(self, request):
    	# 将任务添加到队列中异步执行
        send_msg.delay('邮件')
        send_mail.delay('短信')
        
	# 倘若需要执行定时任务,可以调用apply_async方法,传入相应参数
	# delay方法是该方法的简便形式
	# 例如,让该任务10秒后执行
	send_mail.apply_async(args=('邮件',), countdown=10)
	# 在本地时间2020-10-1 0:0:0执行该任务,tz将时区设定为东八区,即北京时间
	tz = timezone(timedelta(hour=8))
	t = datetime(year=2020, month=10, day=1, hour=0, minute=0, 
		second=0, tzinfo=tz)
	# eta接收一个datetime对象
	send_mail.apply_async(args=('邮件',), eta=t)
        return HttpResponse('ok')

启动celery

在项目目录下,执行:
celery worker -A my_celery.main -l info -P eventlet

在windows 10下启动celery需要添加 -P eventlet 参数,否则执行异步任务时可能会失败。
eventlet是用于并发执行的第三方包,通过pip install eventlet 安装。

你可能感兴趣的:(celery,python,django)