django celery

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')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值