celery:芹菜
-是什么,用来干什么?
-用python写的执行定时任务和异步任务的框架
-执行异步任务:
1 创建任务:tasks.py
2 把任务添加到队列中:add_task.py
3 开启work,执行任务
-用命令:celery -A tasks worker -l info
-在windows下:celery worker -A tasks -l info -P eventlet
4 查看任务执行结果:task_result.py
-多任务结构
-重点:执行work的时候:celery worker -A celery_task -l info -P eventlet
-定时任务执行
-指定一个时间点执行任务
apply_async(args=[4, 3], eta=task_time)
-每天某个时间执行
详情看代码
-启动一个beat,负责调度,添加任务:celery beat -A celery_task -l info
-启动work执行任务:celery worker -A celery_task -l info -P eventlet
-django中使用
-上面讲的多任务结构方式
1 ## Django中使用Celery 2 3 在项目目录下创建celeryconfig.py 4 import djcelery 5 djcelery.setup_loader() 6 CELERY_IMPORTS=( 7 'app01.tasks', 8 ) 9 #有些情况可以防止死锁 10 CELERYD_FORCE_EXECV=True 11 # 设置并发worker数量 12 CELERYD_CONCURRENCY=4 13 #允许重试 14 CELERY_ACKS_LATE=True 15 # 每个worker最多执行100个任务被销毁,可以防止内存泄漏 16 CELERYD_MAX_TASKS_PER_CHILD=100 17 # 超时时间 18 CELERYD_TASK_TIME_LIMIT=12*30 19 20 在app01目录下创建tasks.py 21 from celery import task 22 @task 23 def add(a,b): 24 with open('a.text', 'a', encoding='utf-8') as f: 25 f.write('a') 26 print(a+b) 27 28 视图函数views.py 29 from django.shortcuts import render,HttpResponse 30 from app01.tasks import add 31 from datetime import datetime 32 def test(request): 33 # result=add.delay(2,3) 34 ctime = datetime.now() 35 # 默认用utc时间 36 utc_ctime = datetime.utcfromtimestamp(ctime.timestamp()) 37 from datetime import timedelta 38 time_delay = timedelta(seconds=5) 39 task_time = utc_ctime + time_delay 40 result = add.apply_async(args=[4, 3], eta=task_time) 41 print(result.id) 42 return HttpResponse('ok') 43 44 settings.py 45 INSTALLED_APPS = [ 46 ... 47 'djcelery', 48 'app01' 49 ] 50 51 ... 52 53 from djagocele import celeryconfig 54 BROKER_BACKEND='redis' 55 BOOKER_URL='redis://127.0.0.1:6379/1' 56 CELERY_RESULT_BACKEND='redis://127.0.0.1:6379/2'