生产者:

  • 文件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. db2重组所有表和更新表统计信息

    1.构建db2admin模式下的所有表的重组语句: select ' reorg table '||TABLE_NAME||';' from sysibm.tables where  TABLE_SC ...

  2. Java 编程技巧之数据结构

    前言: 介绍几种常见的java数据结构及应用. 使用HashSet判断主键是否存在 HashSet 实现 Set 接口,由哈希表(实际上是 HashMap )实现,但不保证 set  的迭代顺序,并允 ...

  3. 2018-2-13-win10-UWP-应用设置

    title author date CreateTime categories win10 UWP 应用设置 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...

  4. dotNET面试(二)

    值类型与引用类型 1.值类型和引用类型的区别? 值类型包括简单类型.结构体类型和枚举类型,引用类型包括自定义类.数组.接口.委托等. 赋值方式:将一个值类型变量赋给另一个值类型变量时,将复制包含的值. ...

  5. 力扣 — Rotate List()

    题目描述: 中文: 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...

  6. ivew-admin 点击预览图片

    1. ivew-admin table { title: '产品图片', key: 'avatar1', align: 'center', render: (h, params) => { re ...

  7. 记录下通过Java代码打开cmd启动appium server及在使用过程中碰到的问题

    1.appium server启动后,执行测试脚本,appium日志报错,提示appium setting未安装(原因是小米手机在用appium desktop调试时总是提示是否安装appium se ...

  8. python 常用技巧 — 列表(list)

    目录: 1. 嵌套列表对应位置元素相加 (add the corresponding elements of nested list) 2. 多个列表对应位置相加(add the correspond ...

  9. hdu 4609 3-idiots(FFT+去重处理)

    3-idiots Problem Description King OMeGa catched three men who had been streaking in the street. Look ...

  10. 关于Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7

    GPG key retrieval failed: [Errno 14] Could not open/read file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 ...