Celery:
配置:
setting:
import os
import djcelery
djcelery.setup_loader() #去找到所有app中的tasks.py
BROKER_URL #队列路径推荐redis,RabbitMQ
django setting中
rabbitmq集群配置
BROKER_URL = 'amqp://jietong:jietong@10.0.2.111:5672//' # rabbit设置
BROKER_URL = 'amqp://jietong:jietong@10.0.2.112:5672//' # rabbit设置
CELERY_RESULT_BACKEND = 'redis://localhost:6379/1' #结果存再的路径
CELERY_RESULT_BACKEND='redis://10.0.2.111:6379/2'
CELERY_ACCEPT_CONTENT #任务的接收格式
CELERT_TASK_SERIALIZER='json' #序列化成的格式
CELERT_RESULT_SERIALIZER='json #反序列化
CELERYD_CONCURRENCY = 20 # 并发worker数
CELERY_CREATE_MISSING_QUEUES = True # 某个程序中出现的队列,在broker中不存在,则立刻创建它
CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker最多执行万100个任务就会被销毁,可防止内存泄露
CELERY_DISABLE_RATE_LIMITS = True # 任务发出后,经过一段时间还未收到acknowledge , 就将任务重新交给其他worker执行
CELERY_TASK_RESULT_EXPIRES = 10# 防止任务过期
Celery.py中
import os
import djcelery
from celery import Celery
from kombu import Exchange,Queue
from myplatform import setting
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myplatform.settings')
from django.conf import settings
django.setup() #载入setting
app = Celery('project',include=['project.tasks']) #app中包含的任务 队列相关
在使用rabbit时实现的功能
queue =(
Queue("for_task_A", Exchange("for_task_A"),routing_key="task_a",consumer_arguments = {'x-priority':1}),
)# 路由 Exchange consumer_arguments:'x-priority':number,设置队列优先级,number越大优先级越高
route = {
'project.tasks.upload':{"queue:"for_task_A","routing_key":"task_a",},
}
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda:settings.INSTALLED_APPS)
app.conf.update(CELERY_QUEUES=queue,CELERY_ROUTES=route)
if __name__ == '__main__':
app.start()
tasks.py 中
import django
django.setup()
from celery import shared_task
@shared_task()
views.py 中
apply_async:调用参数,queue:指定队列,routing_key=队列键值
启动时的取消预取机制:
celery -A mytask worker --loglevel=info -Ofair
关于中间件RabbitMQ:
rabbitmq-plugins.bat enable rabbitmq_management 开启网页服务
默认guest
获取任务ID 展示进度条
task_id = result.id
the_task = upload.AsyncResult(task_id)
while the_task.state != 'SUCCESS':
if the_task.state == 'PENDING':
pass#iprint('waiting')
else:
try:
request.websocket.send(str(int(the_task.result.get('p'))))
if int(the_task.result.get('p')) == 100:
request.websocket.send('100')
except:
print(the_task.result)
request.websocket.send('end')