程序员

Celery初体验

2020-06-22  本文已影响0人  小餐包

Celery与任务队列

Celery是Python中流行的分布式任务队列。所谓分布式任务队列,是一种将任务分发到不同的线程、进程或者机器上去执行的一种机制。

一个任务队列的输入是一系列工作,我们称为任务。worker进程通过持续监控任务队列获取需要执行的任务。

Celery中的客户端和worker进程通过消息代理(也叫消息中间件)使用消息进行通信。

一个Celery系统可以由多个worker和代理组成,以便保证高可用性和水平拓展性。

注:由于资金有限,Celery官方是不支持Windows的,不过实际测试开发中还是可以用Windows来测试的。

Celery的优势

Celery的应用场景

消息队列的选择

Celery需要一个消息队列用于在客户端和worker之间接收和发送消息。RabbitMQRedis在Celery里都有完善的支持,其他消息队列比如Amazon SQSZookeeper目前支持的不是很好。如果不是很介意掉电数据丢失的话,建议可以从Redis入手,比较通用。

避坑指南:

笔者按照Flask官方的文档尝试了一下在Flask应用中引入异步的任务,在Windows启动worker时是OK的,但是在执行任务时可能会出现如下错误:

Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)')

这是因为Celery 4.0+的版本官方不支持Windows, 而默认的并发模式Prefork是基于Linux实现的,可行的解决方案是使用gevent或者eventlet作为execution pool(eventlet据说有bug,建议使用gevent),具体操作如下:

pip install gevent

或者在安装celery的使用使用bundle方式一并安装:

pip install celery[gevent]

然后启动worker时指明使用带上-P gevent参数,例如:

celery -A tasks worker -l Info -P gevent

拓展

并发模式

Celery的worker进程相当于一个管理进程,一般(除了下面即将提到的solo模式)都是通过spawn新的进程或者线程来完成对应的task,worker本身不参与任务的执行。

Celery的并发模式目前支持如下方式:

上一篇 下一篇

猜你喜欢

热点阅读