huey
配置简单,支持自动重试失败的任务
轻量级;重在 轻量,代码也比较简单,没有 celery 功能强大,目前只支持redis
Huey——负责协调可执行任务和队列后端
Huey.task()——装饰器来指示可执行任务
Huey.periodic_task() ——装饰器以指示以周期性间隔执行的任务
TaskResultWrapper.get() ——从任务获取返回值
crontab() ——用于定义执行周期性任务的间隔时间
huey 组成 生产,消费,队列,Python main.py 是生产者,
./cons.sh 是消费者 ,队列只能使用 redis 目前只支持队列,从 lpush 打入队列中,brpop 读取
方式,1 先配置队列,消费者需要指定一个实例 config.py
huey 封装了队列 ,用于存取, 主要定义 redis 的储存
task.py api 定义最终被消费者执行的任务,用task 装饰一下,你想让消费者运行的任务,
这样就定义了一个基本的基本任务
主程序是main 导入了配置和任务,确保所有任务都会加载到内存
运行步骤
1 确保本地运行redis
2 安装 huey
3 启动消费者:huey_consumer.py 在./cons.sh 有封装直接运行./cons.sh
huey_consumer可以包含很多参数,主要分为三个group(Logging日志记录, Workers任务worker相关, Scheduler计划任务相关)
4 运行主程序 python main.py,定义需要执行任务的方法
作用:简单的消费
1延迟执行任务
2
2 重试失败任务
异常重试:当任务出现异常时进行retry,并且可以指定重试延时时
Huey支持有限次重试失败任务。如果在执行任务期间引发了异常,但是你已经指定了retries参数,则任务将重新入队并再次尝试,直到指定的重试次数。
如下显示的一个任务,将重试3次,每次都会抛出异常
定期任务 个人觉得还是用linux 自带的crontab 比较好用
huey支持的另一个使用模式是定期执行任务。依照crontab行为,同时遵循类似的语法。定期执行的任务,不应返回有意义的结果,也不应接受任何参数。
让我们添加一个每分钟打印一次字符窜的新任务——我们将使用它来测试消费者是否正在按计划执行任务
取消或暂停任务,
要撤消给定任务的所有实例,请对任务本身使用revoke()和restore()方法:
huey可以停止任务执行。这适用于正常任务,延迟任务和定期任务。
为了“revoke(撤销)”任务,你需要在实例化Huey对象时指定一个result_store参数。
如果消费者没有开始执行任务,你可以取消正常的任务:
取消或暂停定期任务
当我们开始处理定期任务时,撤销选项会更有意思。
我们将使用打印时间代码作为示例:
celery
celery (芹菜)有俩种方法,
1种是装饰器,一种是远程调用,
缺点:1 celery 做定时任务时,有一定的时间的延时,
2 做定时任务会让任务重复,当worker 节点停止了,而beat 在之后才会停止,下一次启动worker 的时候,还会执行上一次未完成的任务,可能会有重复,,所以在看日志的时候,可能会看到上一个的任务
redis 添加操作,把数据存储到Redis里 zadd ()
1,定义任务队列
开启worker 之后
celery
将请求要处理的任务丢到任务队列中去,由空闲的worker 去处理,处理的结果会暂存到后台数据库中去,可以在一台,或多台机器,同时起多个worker 进行操作,来实现分布式任务处理
celery 名词:
任务:task 就是一个python 函数
队列: queue 将执行的任务加入到队列中去
工人:worker 在一个新进程中,负责执行队列的任务
代理人: borker 负责调度,在布置环境中使用redis
启动worker 在普通脚本里,celery -A tasks worker --loglevel=info 运行命令需在,tasks 的目录下
tasks 属于任务文件夹的文件名
celery -A tasks worker --loglevel=info
开始调用程序
from Cleery import celery
import time
=========重点是 任务的远程调用send_task()方法
celery 作为分布式系统,支持远程worker . 可以利用send_task函数,以函数命名的方式调用task,
celery multi start 10 -A rawhttp.image_spider -l warn -c 100 -P gevent -Q rawhttp.image_spider -b redis://127.0.0.1:6379/6
celery 适合实时处理的分布式耗时任务
定时任务不咋用,目前 celery 现在常用的是rabbitmq,可以执行多个worker
用户使用 Celery 产生任务,借用中间人来传递任务,任务执行单元从中间人那里消费任务。任务执行单元可以单机部署,也可以分布式部署,因此 Celery 是一个高可用的生产者消费者模型的异步任务队列,
区别:
1celery 支持不同的存储方式 redis MongoDB,rabbitmq,等
huey 只支持redis
2Celery task 中不允许调用别的 task 后阻塞式的 get 等待结果
3Celery 非常适合用于那种你把任务抛出去就不用管了的场景
4 因为当数据量很大的时候出现了 socket pipeline 错误