安装celery
pip3 install celery
1.celery示例一:普通方法
1.1 s1文件中:定义任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 from celery import Celery 3 ''' 4 1、发布任务 5 2、指定redis作为消息队列来用 6 3、将任务放到消息队列里面的broker里面 7 4、将任务的结果放到消息队列的backend里面 8 5、启动worker来执行当前任务 9 ''' 10 app = Celery('tasks',broker='redis://:123123@123.206.100.71:6379',backend='redis://:123123@123.206.100.71:6379') 11 12 @app.task # task是celery的内置方法 13 def timing_task(x,y): 14 time.sleep(20) 15 return x+y
1.2 在执行任务前先启动worker
由于celery并不支持windows系统环境,则需要先安装一个模块: pip3 install eventlet 启动worker celery -A 定义任务的文件名 worker -l INFO -P eventlet
1.3 s2文件中: 执行任务
import s1 # 执行任务,使用delay,括号里面接被执行任务所需要的参数 result = s1.timing_task.delay(4,7) # 接收到一个id值 print(result) # 3aeeeec0-710b-403a-b241-717c40d53cdc
1.4 s3文件中:查看任务执行结果
from celery.result import AsyncResult from s1 import app # 检测结果 async_result = AsyncResult(id='3a6eac8b-5554-4123-b846-566baa076049',app=app) # id=s2文件中执行的结果 if async_result.successful(): val = async_result.get() print(val) else: print('no')
2.celery示例二:定时任务
2.1 s1文件中:定义任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 from celery import Celery 3 ''' 4 1、发布任务 5 2、指定redis作为消息队列来用 6 3、将任务放到消息队列里面的broker里面 7 4、将任务的结果放到消息队列的backend里面 8 5、启动worker来执行当前任务 9 ''' 10 app = Celery('tasks',broker='redis://:123123@123.206.100.71:6379',backend='redis://:123123@123.206.100.71:6379') 11 12 @app.task 13 def timing_task(x,y): 14 time.sleep(20) 15 return x+y
在执行任务前先启动worker:
celery -A 定义任务的文件名 worker -l INFO -P eventlet
2.2 s2文件中:定义定时任务
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # 获取当前时间 2 ctime = datetime.datetime.now() # 通过datetime直接来获取当前时间 3 4 或者通过time来获取时间,在转换成datetime时间(直接用datetime和time在转换成datetime二者任选其一) 5 6 # 通过time模块指定时间,并转换为字符串时间 7 # btime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(1545126700.8690667)) 8 9 # 把字符串时间转换成datetime时间 10 # date_time = datetime.datetime.strptime(btime,'%Y-%m-%d %H:%M:%S') 11 12 # 转换成utc时间 13 utc_ctime = datetime.datetime.utcfromtimestamp(ctime.timestamp()) 14 15 # 定时50秒后执行任务 16 timing = utc_ctime+datetime.timedelta(seconds=50) 17 18 # 使用apply_async执行任务 19 result = s1.timing_task.apply_async(args=[4,1],eta=utc_ctime) 20 print(result)
3.周期性执行任务:
https://www.cnblogs.com/wupeiqi/articles/8796552.html
4.将celery应用到django中
4.1 创建django项目,命名为 django_celery_test
4.2 在项目同名目录下创建celery文件,且必须是这个名字,文件内容如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import os 2 from celery import Celery 3 4 # set the default Django settings module for the 'celery' program. 5 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery_test.settings') 6 7 app = Celery('django_celery_test') 8 9 # Using a string here means the worker doesn't have to serialize 10 # the configuration object to child processes. 11 # - namespace='CELERY' means all celery-related configuration keys 12 # should have a `CELERY_` prefix. 13 app.config_from_object('django.conf:settings', namespace='CELERY') 14 15 # Load task modules from all registered Django app configs. 16 app.autodiscover_tasks() # 会循环读取项目中的tasks文件
4.3 在settings中配置:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CELERY_BROKER_URL = 'redis://:123123@123.206.100.71:6379' # 指定redis作为消息队列 2 3 CELERY_ACCEPT_CONTENT = ['json'] # 如果序列化的是json不支持的数据类型这里就要改成pickle 4 5 CELERY_RESULT_BACKEND = 'redis://:123123@123.206.100.71:6379' 6 7 CELERY_TASK_SERIALIZER = 'json' # 如果序列化的是json不支持的数据类型这里就要改成pickle
4.4 在项目同名目录下的__init__文件中定义:
from .celery import app as celery_app __all__ = ('celery_app',)
4.5 在app目录下创建tasks文件,文件中定义要执行的任务,启动woker直接-A后面直接写app目录名就行,例如:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 from celery import shared_task 3 4 @shared_task 5 def add(x,y): 6 time.sleep(20) 7 return x+y
4.6 编写url:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from app01 import views 2 3 urlpatterns = [ 4 url(r'^tasks/', views.c_tasks), 5 url(r'^check/', views.check), 6 ]
4.7 编写视图函数,执行任务并对任务的结果进行获取
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 from django.shortcuts import render, HttpResponse 2 from celery.result import AsyncResult 3 from django_celery_test import celery_app 4 from app01 import tasks 5 6 7 # Create your views here. 8 9 def c_tasks(request): 10 """ 11 执行任务 12 任务文件名.任务名.delay(任务参数) 13 :param request: 14 :return: 15 """ 16 result = tasks.add.delay(4, 6) 17 return HttpResponse('任务ID:%s'%result) 18 19 def check(request): 20 tasks_id = request.GET.get('task_id') 21 async_result = AsyncResult(id=tasks_id,app=celery_app) 22 if async_result .successful(): 23 val = async_result.get() 24 return HttpResponse('结果为%s'%val) 25 return HttpResponse('任务还在执行,请稍等...')
4.8 启动worker,如果是在windows系统下则先安装evnetlert模块,在linux或mac则不需要
在终端中:celery -A app目录名 worker -i INFO -P eventlet