安装celery

pip3 install celery

 

1.celery示例一:普通方法
1.1 s1文件中:定义任务

 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
View Code

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文件中:定义任务

 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
View Code

在执行任务前先启动worker:

celery -A 定义任务的文件名 worker -l INFO -P eventlet	

2.2 s2文件中:定义定时任务

 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)
View Code

 

3.周期性执行任务:
https://www.cnblogs.com/wupeiqi/articles/8796552.html


4.将celery应用到django中

4.1 创建django项目,命名为 django_celery_test

4.2 在项目同名目录下创建celery文件,且必须是这个名字,文件内容如下:

 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文件
View Code

4.3 在settings中配置:

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
View Code

4.4 在项目同名目录下的__init__文件中定义:

from .celery import app as celery_app

__all__ = ('celery_app',)

4.5 在app目录下创建tasks文件,文件中定义要执行的任务,启动woker直接-A后面直接写app目录名就行,例如:

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
View Code

4.6 编写url:

1 from app01 import views
2 
3 urlpatterns = [
4     url(r'^tasks/', views.c_tasks),
5     url(r'^check/', views.check),
6 ]
View Code

4.7 编写视图函数,执行任务并对任务的结果进行获取

 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('任务还在执行,请稍等...')
View Code

4.8 启动worker,如果是在windows系统下则先安装evnetlert模块,在linux或mac则不需要

在终端中:celery -A app目录名 worker -i INFO -P eventlet

 

posted on 2019-03-08 15:16  花豆豆  阅读(258)  评论(0编辑  收藏  举报