初识Celery

本系列文章的开发环境:

window 7 + python2.7 + pycharm5 + celery3.1.25 + django1.9.4

在我们日常的开发工作中,经常会遇到这几种情况:

1、在web应用中,用户触发一个操作,执行后台处理程序,这个程序需要执行很长时间才能返回结果。怎样才能不阻塞http请求,不让用户等待从而提高用户体验呢?
2、定时任务脚本:生产环境经常会跑一些定时任务脚本,假如你有上千台的服务器、上千种任务,定时任务的管理很困难,如何对job进行有效的管理?
3、异步需求:比如发送短信/邮件、推送消息、清理/设置缓存?

如果你有以上的需求,那么Celery可能对你很有用。

Celery - 分布式任务队列系统

Celery是一个可以处理大量消息的分布式任务系统,它凭借简单、灵活、可靠的特性被广泛使用。Celery聚焦于实时处理任务,同时也支持定时的任务调度。

1、特性:

  • 查看定时任务的执行情况,比如执行是否成功、当前状态、执行任务花费的时间等。
  • 易于其他框架集成,如使用django管理后台添加、更新、删除任务。
  • 方便把任务和配置管理相关联。
  • 可选多进程、Eventlet和Gevent三种模式并发执行。
  • 提供错误处理机制。

2、架构图

从上图中可以知道Celery包含如下组件:

  • Producer:凡是调用了Celery API、函数或装饰器而产生任务并交给任务队列处理的都是任务生产者。
  • 任务调度组件:Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
  • Celery Worker:负责执行任务的线程,可以在多台服务器运行提高执行效率。
  • Broker:消息中间件,负责接受任务生产者的任务,并且转发work进行执行。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作为消息中间件,官方推荐使用RabbitMQ。
  • Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

开始使用Celery

这里Broker和Result Backend都选择RabbitMQ。

1、安装

1) 安装RabbitMQ

2)  安装Celery 3.1.25

为什么选择这个低版本?请见最下面的问题列表。

pip install celery==3.1.25

2、一个简单例子

  2.1) 在一个目录中创建tasks.py文件,内容如下:

from celery import Celery
#创建celery实例,其中backend表示采用rpc瞬态信息,不保存到数据库;broker表示连接RabbitMQ URL
app = Celery(‘tasks‘,backend=‘rpc://‘,broker=‘pyamqp://[email protected]//‘)

@app.task
def hello():
    return "hello celery"

     2.2) 启动celery worker

到tasks.py文件那层目录,执行以下命令:

celery -A tasks worker --loglevel=info

启动输出信息如下:

E:\workdir\test_pro>celery -A tasks worker --loglevel=info
[2017-05-10 18:26:18,298: WARNING/MainProcess] c:\python27\lib\site-packages\celery\apps\worker.py:161: CDeprecationWarnin
Starting from version 3.2 Celery will refuse to accept pickle by default.

The pickle serializer is a security concern as it may give attackers
the ability to execute any command.  It‘s important to secure
your broker from unauthorized access when using pickle, so we think
that enabling pickle should require a deliberate action and not be
the default choice.

If you depend on pickle then you should set a setting to disable this
warning and to be sure that everything will continue working
when you upgrade to Celery 3.2::

    CELERY_ACCEPT_CONTENT = [‘pickle‘, ‘json‘, ‘msgpack‘, ‘yaml‘]

You must only enable the serializers that you will actually use.

  warnings.warn(CDeprecationWarning(W_PICKLE_DEPRECATED))

 -------------- [email protected] v3.1.25 (Cipater)
---- **** -----
--- * ***  * -- Windows-7-6.1.7601-SP1
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> app:         tasks:0x35fc240
- ** ---------- .> transport:   amqp://guest:**@localhost:5672//
- ** ---------- .> results:     rpc://
- *** --- * --- .> concurrency: 4 (prefork)
-- ******* ----
--- ***** ----- [queues]
 -------------- .> celery           exchange=celery(direct) key=celery

[tasks]
  . tasks.hello

[2017-05-10 18:26:18,433: INFO/MainProcess] Connected to amqp://guest:**@127.0.0.1:5672//
[2017-05-10 18:26:18,483: INFO/MainProcess] mingle: searching for neighbors
[2017-05-10 18:26:19,497: INFO/MainProcess] mingle: all alone
[2017-05-10 18:26:19,523: WARNING/MainProcess] [email protected] ready.

2.3) 测试结果

另起一个终端,还是到tasks.py那层目录,进入python命令行:

这时celery worker会有提示信息:

到此为止,celery入门就介绍到这里了,下一节介绍如何在django中使用celery。

遇到的问题列表:

 1、启动celery worker时报错

ERROR:
`[2016-11-05 20:23:25,759: CRITICAL/MainProcess] Unrecoverable error: TypeError(‘must be integer, not _subprocess_handle‘,)
Traceback (most recent call last):
File "c:\development\env\zillow2\lib\site-packages\celery\worker\worker.py", line 203, in start
self.blueprint.start(self)
File "c:\development\env\zillow2\lib\site-packages\celery\bootsteps.py", line 119, in start
step.start(parent)
File "c:\development\env\zillow2\lib\site-packages\celery\bootsteps.py", line 370, in start
return self.obj.start()
File "c:\development\env\zillow2\lib\site-packages\celery\concurrency\base.py", line 131, in start
self.on_start()
File "c:\development\env\zillow2\lib\site-packages\celery\concurrency\prefork.py", line 112, in on_start
**self.options)
File "c:\development\env\zillow2\lib\site-packages\billiard\pool.py", line 1008, in init
self._create_worker_process(i)
File "c:\development\env\zillow2\lib\site-packages\billiard\pool.py", line 1117, in _create_worker_process
w.start()
File "c:\development\env\zillow2\lib\site-packages\billiard\process.py", line 122, in start
self._popen = self._Popen(self)
File "c:\development\env\zillow2\lib\site-packages\billiard\context.py", line 383, in _Popen
return Popen(process_obj)
File "c:\development\env\zillow2\lib\site-packages\billiard\popen_spawn_win32.py", line 64, in init
_winapi.CloseHandle(ht)
TypeError: must be integer, not _subprocess_handle

(zillow2) C:\DEVELOPMENT\zillow2\project>Traceback (most recent call last):
File "", line 1, in
File "c:\development\env\zillow2\lib\site-packages\billiard\spawn.py", line 159, in spawn_main
new_handle = steal_handle(parent_pid, pipe_handle)
File "c:\development\env\zillow2\lib\site-packages\billiard\reduction.py", line 121, in steal_handle
_winapi.PROCESS_DUP_HANDLE, False, source_pid)
WindowsError: [Error 87] The parameter is incorrect

解决方案:这是因为windows系统不支持celery4以上版本,请降级到3.xx即可解决该问题

参考文档:https://zhuanlan.zhihu.com/p/22304455

时间: 2024-10-11 16:33:10

初识Celery的相关文章

7,知识拾遗-Wusir-crm项目-celery初识-celery案例

参考博客: https://www.cnblogs.com/wupeiqi/articles/8796552.html 什么情况下使用celery: 一个请求的处理时间特别长 先进行安装: pip3 install celerypip3 install eventlet user:用户程序,用于告知celery去执行一个任务. broker: 存放任务(依赖RabbitMQ或Redis,进行存储) worker:执行任务 / 依赖redis做消息队列(存放任务和结果) // // worker

Celery初识及简单实例

Celery是一个"自带电池"的任务队列.易于使用,可以轻易入门,它遵照最佳实践设计,使产品可以扩展,或与其他语言集成,并且它自带了在生产环境中运行这样一个系统所需的工具和支持.本文介绍基础部分: 选择和安装消息传输方式(中间人). 安装Celery并创建一个任务 运行职程并调用任务 追踪任务在不同状态间的迁移,并检视返回值 一.选择中间人 Celery需要一个发送和接收消息的解决方案,其通常以独立服务形式出现,称为消息中间人. 可行的选择包括: RabbitMQ RabbitMQ功能

初识Python,望君多多关照

在学习Python之前,我们接触过数据结构和网页制作.前者让我们学习如何把C语言运用的更加整齐规范,而后者让我们亲身学习如何运用所学,制作一个静态网页.通过这些课程的学习,让我对C语言产生了比较大的压力,以至于对编程.对这学期的Python课程都有一种如临大敌的感觉. 但是真的学习了这门课程,体会了编码过程中的一些固定运用方法和套路之后,也许过程中对这门课程隐隐约约产生了一点点朦胧的感觉,仿佛他也并没有想象中的那么困难,起码现在的学习让我认为,他可能没有C语言那么繁琐和麻烦.当然,以一个初学者的

初识数组排序!!!!

<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>初识数组排序</title> <!--调试成功--> <style type="text/css"> *{ padding:0; margin: 0; } li,ul{ list-style: none; } #p

初识操作系统和linux

初识操作系统和linux 1.计算机系统由硬件系统和软件系统两大部分组成:是一种能接收和存储信息,并按照存储在其内部的程序对海量数据进行自动.高速地处理,然后把处理结果输出的现代化智能电子设备. 2.世界上第一台计算机是1946年诞生在美国宾州大学. 3.冯·诺依曼体系结构:1946年数学家冯·诺依曼于提出计算机硬件系统由运算器.控制器.存储器.输入设备.输出设备.摩根定律:当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍.现在计算机技术进本很难遵

JAVA 初识类加载机制 第13节

JAVA 初识类加载机制 第13节 从这章开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要编译成.class文件,再由虚拟机解释给当前的操作系统去执行.这些过程都是我们看不见的,我们能看见的也就是一个.class文件.既然虚拟机要解释这些.class文件给当前的操作系统听,那么他怎么获得这些.class文件呢?虚拟机获得这些.class文件的过程就是类加载了. 所以,总结来说就是:虚拟机将.class文件从磁盘或者其他地

初识React

原文地址:北云软件-初识React 专注于UI 在MVC分层设计模式中,react常被拿来实现视图层(V).React不依赖于技术栈的其他部分,因此可以方便的在现有项目中尝试用它来实现一个小特性. 虚拟DOM React从DOM中抽象出来,给出一种更简洁的编程模型,且性能表现更好.能够通过NodeJS实现服务端渲染,通过React Native开发原生app. 数据流React实现单向.响应式数据流,减少boilerplate且比传统数据绑定更容易理解. 简洁的组件React的组件都实现了一个r

泛型的几种类型以及初识webform

今天学习的可以分为两类吧,但是学习的都是比较抽象的,不太容易掌握吧.首先我们大部分时间学习了泛型,泛型的委托,泛型接口以及枚举器,迭代器,扩展方法:最后简单的认识了webform,实现了一个简单的功能. 一.泛型 定义:泛型(generic)可以软糖多个类型共享一组代码,泛型允许我们声明类型参数化.可以用不同的类型进行实例化,说白了,就是可以用类型占位符,创建具体类型致命的真实概念.C#中提供了五种泛型,类,结构,接口,委托和方法.下面举例说明可能更容易理解, class MyStack<T>

最新计算机技术与管理科学应用专家——初识ERB

ERB管理系统:英文全称Enterprise Resource and Behavior,英文简称:ERB,中文名全称:企业资源与行为管理系统.ERB是由理文企业管理顾问有限公司首席管理师,现任商翼ERB企业管理系统项目总监吴志华先生,于2010年9月首先提出的.ERB不再单以供应链管理作为系统应用的基础,而是以企业行为与企业资源规划的最佳结合作为系统应用设计的核心基础,强调企业行为的规划.执行.监督与追溯,强调企业管理水平与员工素养的持续提升:提供企业行为与企业资源管理最佳结合的整体应用解决方