生产者:

  • 文件1: 定义任务
#!/usr/bin/env python3
# coding: utf-8 from celery import Celery
import settings pw = settings.SESSION_REDIS['password']
celery_broker = 'redis://:%s@localhost:6379/0' % pw
celery_backend = celery_broker app = Celery('tasks', broker=celery_broker, backend=celery_backend) @app.task
def analysis_main_12(current_id_str, q_num_str):
pass @app.task
def analysis_main_3(current_id_str, q_num_str):
pass
  • 文件2: 产生任务并放到队列
from celery_tasks import analysis_main_12, analysis_main_3

def main():
......
q = get_q3_from_db()
ret = analysis_main_3.apply_async(args=(str(current_test.id), str(q_num)), queue='for_q_type3')
q = get_q12_from_db()
ret = analysis_main_12.apply_async(args=(str(current_test.id), str(q_num)), queue='for_q_type12') # ret是 "AsyncResult"对象, id 可由 ret.id取得
...... if __name__ == '__main__':
main()

注: 该文件中使用了mytaskfunction.apply_async(...)而非mytaskfunction.delay(...):后者是前者的包装(使用更方便),而直接使用前者则可使用更多参数,比如queue。

这里的queue正是要在消费者中配置使用的queue,注意名字要对应,不要写错。


## 消费者(worker)
- 文件1:定义任务函数
除了配置celery app之外,主要工作是配置celery使用的队列和routes:
```
import config
from kombu import Queue, Exchange
from celery import Celery

app = Celery('tasks', broker=config.Celery_broker, backend=config.Celery_backend)

logging.basicConfig(level=logging.DEBUG,

format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s:\t%(message)s')

配置队列

CELERY_QUEUES = (

Queue('for_q_type3', Exchange('for_q_type3'), routing_key='for_q_type3'), # consumer_arguments={'x-priority': 10}),

Queue('for_q_type12', Exchange('for_q_type12'), routing_key='for_q_type12'), # consumer_arguments={'x-priority': 1}),

Queue('default', Exchange('default'), routing_key='default'),

) # consumer_arguments={'x-priority': 5} 数字越大,优先级越高 - only for rabbitmq?

CELERY_DEFAULT_QUEUE = 'default'

CELERY_DEFAULT_EXCHANGE = 'default'

CELERY_DEFAULT_ROUTING_KEY = 'default'

CELERY_ROUTES = {

# -- HIGH PRIORITY QUEUE -- #

'app.tasks.analysis_main_3': {'queue': 'for_q_type3'},

# -- LOW PRIORITY QUEUE -- #

'app.tasks.analysis_main_12': {'queue': 'for_q_type12'},

'app.tasks.analysis_main': {'queue': 'default'},

}

@app.task

def analysis_main_12(current_id, q_num):

......

your code here

......

@app.task

def analysis_main_3(current_id, q_num):

......

your code here

......


- 启动命令 或 docker的entrypoint.sh
例如,这是一个entrypoint.sh:
```bash
#!/bin/sh echo executing entrypoint.sh ...
celery worker -A celery_tasks.app -n worker_Qtype12 -Q for_q_type12 --loglevel=info --concurrency=12 &
celery worker -A celery_tasks.app -n worker_Qtype3 -Q for_q_type3 --loglevel=info --concurrency=8 &
celery flower -A celery_tasks.app --address=0.0.0.0 --port=50080

注意

上述配置中需要注意生产者、消费者和启动命令三者所用的queue是相对应的,不要写错。

上述配置只验证了多个任务队列,至于优先队列功能是否有效未做验证。 - priority queue 参考:

https://stackoverflow.com/questions/15809811/celery-tasks-that-need-to-run-in-priority

celery使用多队列的更多相关文章

  1. 安装 rabbitmq ,通过生成器获取redis列表数据 与 Celery 分布式异步队列

    一.安装rabbitmq  @全体成员 超简易安装rabbitmq文档 1.安装配置epel源rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/ ...

  2. celery 分布式异步队列框架使用方法

    简介: Celery  是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向broker传递消息,然后celery ...

  3. celery异步消息队列的使用

    1.准备工作 1.1 流程图 2.环境安装 2.1.在Ubuntu中需要安装redis 安装redis $sudo apt-get update $sudo apt-get install redis ...

  4. 分布式队列神器 Celery

    Celery 是什么? Celery 是一个由 Python 编写的简单.灵活.可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具. Celery 专注于实时任务处理,支持任 ...

  5. Celery ---- 分布式队列神器 ---- 入门

    原文:http://python.jobbole.com/87238/ 参考:https://zhuanlan.zhihu.com/p/22304455 Celery 是什么? Celery 是一个由 ...

  6. 分布式队列Celery

    Celery是什么? Celery 是一个由 Python 编写的简单.灵活.可靠的用来处理大量信息的分布式系统,它同时提供操作和维护分布式系统所需的工具. Celery 专注于实时任务处理,支持任务 ...

  7. Flask 与 Celery 在 windows 下的集成问题

    Flask 与 Celery 在 windows 下的集成问题 所有的 Web 框架内部的视图中不适合执行需要长时间运行的任务,包括 Flask .Django 等.这类型的任务会阻塞 Web 的响应 ...

  8. 【Python】分布式任务队列Celery使用参考资料

    Python-Celery Homepage | Celery: Distributed Task Queue User Guide - Celery 4.0.2 documentation Task ...

  9. python之celery的使用(一)

    前段时间需要使用rabbitmq做写缓存,一直使用pika+rabbitmq的组合,pika这个模块虽然可以很直观地操作rabbitmq,但是官方给的例子太简单,对其底层原理了解又不是很深,遇到很多坑 ...

随机推荐

  1. Android No static field XXX of type I in class Lcom/XXX/R$id错

    问题复现: 问题原因: 出现这样的情况,你先检查你的依赖工程(module)的对应布局layout/xxx.xml是否跟主项目的layout重名,你点开R文件的时候,你会发现你的布局发生了错乱,导致你 ...

  2. js 动态绑定解绑事件

    function addEvent(obj, type, handle) { if (obj.addEventListener) { obj.addEventListener(type, handle ...

  3. SET TRANSACTION - 设置当前事务的特性

    SYNOPSIS SET TRANSACTION [ ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE } ] [ READ WRITE | READ O ...

  4. Redis的备份与恢复

    备份 dump.rdb:RDB方式的备份文件 appendonly.aof:AOF方式的备份文件 rdb 备份处理 # 编辑redis.conf文件,找到如下参数,默认开启. save 900 1 s ...

  5. eclipse远程调试Tomcat方法(转)

    转自:http://blog.csdn.net/afgasdg/article/details/9236877 1.Linux中配置tomcat在catalina.sh中添加如下CATALINA_OP ...

  6. python-django_rest_framework中的request/Response

    rest_framework中的request是被rest_framework再次封装过的,并在原request上添加了许多别的属性: (原Django中的request可用request._requ ...

  7. svn解决方案

    1.svn回退 revert to this version 2.不同svn路径拉倒一个本地文件夹,报错"已经指向不同的url工作副本":  删除文件夹中的.svn文件夹 3.sv ...

  8. 【串线篇】Mybatis入门

    MyBatis是持久化层框架(SQL映射框架)-操作数据库 一.环境搭建 1).创建一个java工程,java工程就行: 2). 创建表:自己用工具创建 创建javaBean:Employee(封装表 ...

  9. redis相关笔记(三.redis设计与实现(笔记))

    redis笔记一 redis笔记二 redis笔记三 1.数据结构 1.1.简单动态字符串: 其属性有int len:长度,int free:空闲长度,char[] bur:字符数组(内容) 获取字符 ...

  10. hibernate 双向1对多

    1: 还是用客户Customer和订单Order来解释: “一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户. “双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪 ...