首页 > 代码库 > 初识Celery

初识Celery

    

本系列文章的开发环境:

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

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

1
2
3
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

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

1
pip install celery==3.1.25

2、一个简单例子

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

技术分享

 celery = Celery(,backend=,broker=

技术分享

     2.2) 启动celery worker

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

celery -A tasks worker --loglevel=info

启动输出信息如下:

技术分享 View Code

     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即可解决该问题

 


初识Celery