认识

这里有几个概念,task、worker、broker。
顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员。

那什么是 Broker 呢?

老板给你下发任务时,你需要 把它记下来, 这个它 可以是你随身携带的本子,也可以是 电脑里地记事本或者excel,或者是你的 任何时间管理工具。

Broker  则是 Celery 记录task的地方。
作为一个任务管理者的你,将老板(前端程序)发给你的 安排的工作(Task) 记录到你的本子(Broker)里。接下来,你就安排你手下的IT程序猿们(Worker),都到你的本子(Broker)里来取走工作(Task)

 

1. broker为rabbitmq

#tasks.py

 
  1. from celery import Celery
  2.  
  3. app = Celery('tasks', broker='amqp://admin:admin@localhost:5672')
  4.  
  5. @app.task
  6. def add(x, y):
  7. return x + y
 

启动

  1. celery -A tasks worker --loglevel=info

运行

  1. >>> from tasks import add
  2. >>> add(1, 3)
  3. 4
  4. >>> add.delay(1,3)
  5. <AsyncResult: 07614cef-f314-4c7b-a33f-92c080cadb83>
  6. >>>

:delay是使用异步的方式,会压入到消息队列。否则,不会使用消息队列。

文件名为tasks.py,则其中代码app = Celery('tasks', broker=),Celery第一个参数为文件名,启动时也是celery -A tasks worker --loglevel=info

2. 以python+文件名的方式启动

例1:

#test.py

 
  1. from celery import Celery
  2. import time
  3. app = Celery('test', backend='amqp', broker='amqp://admin:admin@localhost:5672')
  4.  
  5. @app.task
  6. def add(x, y):
  7. print "------>"
  8. time.sleep(5)
  9. print "<--------------"
  10. return x + y
  11.  
  12. if __name__ == "__main__":
  13. app.start()
 

启动

  1. python test.py worker

celery默认启动的worker数为内核个数,如果指定启动个数,用参数-c,例

  1. python test.py worker -c 2

例2:

#test.py

 
  1. from celery import Celery
  2. import time
  3. app = Celery('test', backend='amqp', broker='amqp://admin:admin@localhost:5672')
  4.  
  5. @app.task
  6. def add(x, y):
  7. print "------>"
  8. time.sleep(2)
  9. print "<--------------"
  10. return x + y
  11.  
  12. if __name__ == "__main__":
  13. app.start()
 

#eg.py

 
  1. from test import *
  2. import time
  3.  
  4. rev = []
  5. for i in range(3):
  6. rev.append(add.delay(1,3))
  7.  
  8. print "len rev:", len(rev)
  9. while 1:
  10. tag = 1
  11. for key in rev:
  12. if not key.ready():
  13. tag = 0
  14. time.sleep(1)
  15. print "sleep 1"
  16. if tag:
  17. break
  18. print "_____________________>"
 

3. broker为redis

#test_redis.py

  1. from celery import Celery
  2. import time
  3. #app = Celery('test_redis', backend='amqp', broker='redis://100.69.201.116:7000')
  4. app = Celery('test_redis', backend='redis', broker='redis://100.69.201.116:7000')
  5.  
  6. @app.task
  7. def add(x, y):
  8. print "------>"
  9. time.sleep(5)
  10. print "<--------------"
  11. return x + y
  12.  
  13. if __name__ == "__main__":
  14. app.start()

启动

  1. python test_redis.py worker -c 2

测试

  1. from celery import group
  2. from test_redis import *
  3. g = group(add.s(2, 3)).apply_async()
  4. g = group(add.s(2, 3)).apply_async()
  5. g = group(add.s(2, 3)).apply_async()
  6. g = group(add.s(2, 3)).apply_async()
  7. g = group(add.s(2, 3)).apply_async()
  8. for ret in g.get():
  9. print ret
  10. print "end-----------------------------------"

结果

  1. 5
  2. end-----------------------------------

4. 两个队列(redis)

#test_redis.py

  1. from celery import Celery
  2. import time
  3. #app = Celery('test_redis', backend='amqp', broker='redis://100.69.201.116:7000')
  4. app = Celery('test_redis', backend='redis', broker='redis://100.69.201.116:7000')
  5.  
  6. @app.task
  7. def add(x, y):
  8. print "------>"
  9. time.sleep(5)
  10. print "<--------------"
  11. return x + y
  12.  
  13. if __name__ == "__main__":
  14. app.start()

#test_redis_2.py

  1. from celery import Celery
  2. import time
  3. #app = Celery('test_redis', backend='amqp', broker='redis://100.69.201.116:7000')
  4. app = Celery('test_redis_2', backend='redis', broker='redis://100.69.201.116:7001')
  5.  
  6. @app.task
  7. def add_2(x, y):
  8. print "=======>"
  9. time.sleep(5)
  10. print "<================="
  11. return x + y
  12.  
  13. if __name__ == "__main__":
  14. app.start()

测试

  1. from celery import group
  2. from test_redis import *
  3. from test_redis_2 import *
  4. ll = [(1,2), (3,4), (5,6)]
  5. g = group(add.s(key[0], key[1]) for key in ll).apply_async()
  6. for ret in g.get():
  7. print ret
  8. print "end redis_1 -----------------------------------"
  9.  
  10. ll = [(1,2), (3,4), (5,6)]
  11. g = group(add_2.s(key[0], key[1]) for key in ll).apply_async()
  12. for ret in g.get():
  13. print ":", ret
  14. print "end redis_2 -----------------------------------"

结果

  1. 3
  2. 7
  3. 11
  4. end redis_1 -----------------------------------
  5. : 3
  6. : 7
  7. : 11
  8. end redis_2 -----------------------------------

5. 两个队列(同一个rabbitmq)

注释:需要提前设置下队列

##例1

#test.py

  1. from celery import Celery
  2. import time
  3. app = Celery('test', backend='amqp', broker='amqp://admin:admin@localhost:5672//')
  4.  
  5. @app.task
  6. def add(x, y):
  7. print "------>"
  8. time.sleep(5)
  9. print "<--------------"
  10. return x + y
  11.  
  12. if __name__ == "__main__":
  13. app.start()

#test_2.py

  1. from celery import Celery
  2. import time
  3. app = Celery('test_2', backend='amqp', broker='amqp://admin:admin@localhost:5672//hwzh')
  4.  
  5. @app.task
  6. def add_2(x, y):
  7. print "=====>"
  8. time.sleep(5)
  9. print "<=========="
  10. return x + y
  11.  
  12. if __name__ == "__main__":
  13. app.start()

测试

  1. from celery import group
  2. from test import *
  3. from test_2 import *
  4.  
  5. ll = [(1,2), (3,4), (7,8)]
  6. g = group(add.s(key[0], key[1]) for key in ll).apply_async()
  7. for ret in g.get():
  8. print ret
  9.  
  10. ll = [(1,2), (3,4), (7,8)]
  11. g = group(add_2.s(key[0], key[1]) for key in ll).apply_async()
  12. for ret in g.get():
  13. print ret

结果

  1. 3
  2. 7
  3. 15
  4. 3
  5. 7
  6. 15

##例2

#test.py

  1. from celery import Celery
  2. import time
  3. app = Celery('test', backend='amqp', broker='amqp://admin:admin@localhost:5672//mq4')
  4.  
  5. @app.task
  6. def add(x, y):
  7. print "------>"
  8. time.sleep(2)
  9. print "<--------------"
  10. return x + y
  11.  
  12. @app.task
  13. def sum(x, y):
  14. print "------>"
  15. time.sleep(2)
  16. print "<--------------"
  17. return x + y
  18.  
  19. if __name__ == "__main__":
  20. app.start()

#eg2.py

  1. from test import *
  2. import time
  3.  
  4. rev = []
  5. for i in range(3):
  6. rev.append(add.delay(1,3))
  7.  
  8. for i in range(3):
  9. rev.append(sum.delay(1,3))
  10.  
  11. print "len rev:", len(rev)
  12. while 1:
  13. tag = 1
  14. for key in rev:
  15. if not key.ready():
  16. tag = 0
  17. time.sleep(1)
  18. print "sleep 1"
  19. if tag:
  20. break
  21. print "_____________________>"

6. 保存结果

  1. from celery import Celery
  2.  
  3. app = Celery('tasks', backend='amqp', broker='amqp://admin:admin@localhost')
  4.  
  5. @app.task
  6. def add(x, y):
  7. return x + y

启动

  1. celery -A tasks_1 worker --loglevel=info

与前例不同:

- ** ---------- [config]
- ** ---------- .> app: tasks:0x7f8057931810
- ** ---------- .> transport: amqp://admin:**@localhost:5672//
- ** ---------- .> results: amqp

运行

  1. >>> from tasks_1 import add
  2. >>> result = add.delay(1, 3)
  3. >>> result.ready()
  4. True
  5. >>> result.get()
  6. 4

7. 多个队列

  1. from celery import Celery
  2. from kombu import Exchange, Queue
  3. BROKER_URL = 'amqp://admin:admin@localhost//'
  4. app = Celery('tasks', backend='amqp',broker=BROKER_URL)
  5. app.conf.update(
  6. CELERY_ROUTES={
  7. "add1":{"queue":"queue_add1"},
  8. "add2":{"queue":"queue_add2"},
  9. "add3":{"queue":"queue_add3"},
  10. "add4":{"queue":"queue_add4"},
  11. },
  12. )
  13. @app.task
  14. def add1(x, y):
  15. return x + y
  16.  
  17. @app.task
  18. def add2(x, y):
  19. return x + y
  20.  
  21. @app.task
  22. def add3(x, y):
  23. return x + y
  24.  
  25. @app.task
  26. def add4(x, y):
  27. return x + y

celery入门的更多相关文章

  1. Celery入门指北

    Celery入门指北 其实本文就是我看完Celery的官方文档指南的读书笔记.然后由于我的懒,只看完了那些入门指南,原文地址:First Steps with Celery,Next Steps,Us ...

  2. 分布式队列Celery入门

    Celery 是一个简单.灵活且可靠的,处理大量消息的分布式系统,并且提供维护这样一个系统的必需工具.它是一个专注于实时处理的任务队列,同时也支持任务调度.Celery 是语言无关的,虽然它是用 Py ...

  3. celery 入门

    认识 这里有几个概念,task.worker.broker.顾名思义,task 就是老板交给你的各种任务,worker 就是你手下干活的人员. 那什么是 Broker 呢? 老板给你下发任务时,你需要 ...

  4. 分布式任务队列Celery入门与进阶

    一.简介 Celery是由Python开发.简单.灵活.可靠的分布式任务队列,其本质是生产者消费者模型,生产者发送任务到消息队列,消费者负责处理任务.Celery侧重于实时操作,但对调度支持也很好,其 ...

  5. 异步任务神器 Celery-入门

    一.Celery入门介绍 在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避免它们阻塞主程序的运行,我们经常会采用多线程或异步任务.比如,在 Web 开发中,对新用户的注册,我们通常会给他 ...

  6. 初识Celery

    本系列文章的开发环境: window + python2. + pycharm5 + celery3.1.25 + django1.9.4 在我们日常的开发工作中,经常会遇到这几种情况: 1.在web ...

  7. Celery异步调度框架(一)基本使用

    介绍 之前部门开发一个项目我们需要实现一个定时任务用于收集每天DUBBO接口.域名以及TOMCAT(核心应用)的访问量,这个后面的逻辑就是使用定时任务去ES接口抓取数据存储在数据库中然后前台进行展示. ...

  8. Django中使用Celery

    一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celery入门与进阶,而做python WEB开发最为流行的框架莫属Django,但是Django的请 ...

  9. 转 Celery 使用

    http://www.mamicode.com/info-detail-1798782.html https://blog.csdn.net/lu1005287365/article/details/ ...

随机推荐

  1. yii2表关联实例

    yii2表关联 1.两张表关联,以“商品表关联品牌表”为例 控制器中: $goods_model=new Goods(); $goods_info=$goods_model::find()->j ...

  2. jQuery学习之prop和attr的区别

    1.attr() :默认保存的是浏览器的初始值  prop()保存的是更新的值 2.下面的是首用法,但是.attr()方法可以运行在所有的attributes情况下. 注意:一些DOM元素的prope ...

  3. [置顶] 关于产品的一些思考——腾讯之UIDesigner

        首先要赞一下这个软件,上手快,效果好,不过还有些有待提高的地方. 1.不稳定     设置了页面跳转效果后,继续编辑,前边已经编辑过的页面跳转效果有的会失效,或者变为其他跳转效果. 2.键盘无 ...

  4. android 学习随笔十九(对话框、样式、主题、国际化 )

    1.对话框 package com.itheima.dialog; import android.os.Bundle; import android.app.Activity; import andr ...

  5. tcp socket

    1.TCP连接手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在"无差别&quo ...

  6. scala抽象类抽象字段

    package com.test.scala.test /** * 抽象类学习,定义abstact关键字 */ abstract class AbstractClass { val id:Int;// ...

  7. linux下共享内存mmap和DMA(直接访问内存)的使用 【转】

    转自:http://blog.chinaunix.net/uid-7374279-id-4413316.html 介绍Linux内存管理和内存映射的奥秘.同时讲述设备驱动程序是如何使用“直接内存访问” ...

  8. Asp.Net Web Api 2 实现多文件打包并下载文件示例源码_转

    一篇关于Asp.Net Web Api下载文件的文章,之前我也写过类似的文章,请见:<ASP.NET(C#) Web Api通过文件流下载文件到本地实例>本文以这篇文章的基础,提供了Byt ...

  9. Content Delivery Network

    Coding Standards & Best Practices 7 Reasons to use a Content Delivery Network CDN公共库汇总

  10. 2、HTML

    软件的结构: C/S(Client Server)结构的软件: 比如: QQ. 极品飞车. 飞信 . 迅雷 cs结构的软件的缺点:更新的时候需要用户下载更新包然后再安装,程序员则需要开发客户端与服务端 ...