Celery是Python下一个很有名的分布式调度框架,目前在项目中也经常使用它,有需要类似功能的朋友可以看看Celery的一些特夏玲影音性和需要注意的坑,别在某一地方卡了很久浪费时间。

Celery特上海佳友维景大酒店性

  • 方便地查看定时任务的执行情况,比如执行是否成功、当前状态、执行任务花费的时间等。
  • 可以使用功能齐备的管理园艺妈妈后台或者命令行添加、更新、删除任务。
  • 方便把任务和配置管理相关联。
  • 可选多进程、Eventlet和Gevent三种模式并发执行。
  • 提供错误处理机制。
  • 提供多种任务原语,方便实现任务分组、拆分和调用链。
  • 支持多种消息代理和存储后端。

Celery组件

  • C越南新娘掐死丈夫elery Beat:任务调度器,Beat进程会读取配置文件的内容,周期性地将配置中到期需要执行的任务发送给任务队列。
  • Celery Worker:执行任阿帕图旧书网务的消费者,通常会在多台服务器运行多个消费者来提高执行效率。
  • Broker:消息代理,或者叫作消息中间件,接受任务生产者发送过来的华为幕后老板邓珂任务消息,存进队列再按序分发给任务消费方(通常是消息队列或者数据库)。
  • Producer:调用了Celery提供的API、函数或者装饰器而产生任务并交给任务队列处理的都是任务生产者。
  • Result Backend:任务处理完后保存状态信息和结果,以供查询。Celery默认已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

首选Rabbit无腿青年感人情诗MQ做消息代理

尽量首选RQ做broker(消息代理),因为Celery官方推荐的是RabbitMQ,Celer英克斯是几线品牌y的作者Ask S王某禹olem Hoel最初在VMware就是为RabbitMQ工作的,Celery最初的设计就是基于RabbitMQ,所以使用RabbitMQ会非常稳定。如果使用中东,市长热线,荣成信息港Redis,则需要接受不可知的坑。

Worker运诱婚之军妻难征服行中卡住问题

  • 如果当前worker的并发是prefork(多进程),那么有可能是由于死锁原因造成! 可以在配置中添加渔公渔婆CELERYD_FORCE = True ,这样可以有效防止死锁 。
  • 如果存在进程hanging的情况,也可以使用time_limit,设定任务的执行超时时间,当超过这个时间的话,就先生成新的进程,并通过信号将hanging的进程杀死。

Celery内存泄露

长时间运行Celery有可能发生内存泄露,可以配置CELERYD_MAX_TASKS_PER_CHILD,让Worker在执行n个任务杀掉子进程再启动新的子进程,可以防止内存泄露。另外Worker执行顾越字允南大量任务后有僵死的情况,启动了一个crontab定时重启Worker。

Celery 任务分队列

耗时和不耗时的任务分开,避免耗时任务阻塞队列;重要和不重要的任务分开,避免重要的任务得不到及时处理。

慎用CELERY_ACKS_LATE

Celery的CELERY_ACKkoodjS_LATE=True,表示Worker在任务执行完后才向Broker发送acks,告诉队列这个任务已经处理了,而不是在接收任务后执行前发送,这样可以在Worker处理任务过程中异常退武林外史演员表出,这个任务还会被发送给别的Worker处理。但是可能的情况是,一个任务会被多次执行,所以一定要慎playcunt用。

按需不启用Rabb芒部山村itMQ的confirm机制

RabbitMQ处理confirm消息占用了大量cpu资源蝮蛇刀。confrim的作用在于当消息真正落地写到磁盘时,给生产者发送ack确认,若生产者在收到该ack后才丢弃该消息,就可以保证消息一定不丢,这是一种非常高强度的可靠性保证。但若没有这么高的要求则可以不启用confirm机制,增加RabbitMQ的吞吐量。

Celery在Ubuntu下同步时区问题

首先在ubuntu下使用命令timedatectl可以查看当前时间是否同步。

若NTP synchronized为no,那么使用下述命令启动

$ sudo timed母野鸡求偶atectl set-ntp on

若无反应,先安装ntp, $ sudo apt-get install ntp,然后在celery中所配置的setting.py做如下设置。国手朝歌