一huey 库简介
一个轻型的任务队列,功能和相关的broker没有celery强大,重在轻型,而且代码读起来也比较的简单。
1、下载安装huey。
pip install huey
2 、下载安装redis依赖(huey暂时只支持redis)。
pip install redis
3、 a: config.py: 定义使用huey的一些配置,任务的redis存储
from huey import RedisHuey
huey = RedisHuey(‘base_app’, host=‘127.0.0.1’)
或者
from huey import RedisHuey
from redis import ConnectionPool
import settings
redis_pool = ConnectionPool(host=settings.REDIS_ADDRESS, port=settings.REDIS_PORT, db=0)
huey = RedisHuey('base_app', connection_pool=redis_pool)
**b: task.py利用config.py所创建的huey来修饰普通函数使之成为huey任务。这样就定义了一个最基本的异步任务。
这是文档中的例子**
from base.base_huey import huey
@huey.task()
def count_beans(num):
print('-- counted %s beans --' % num)
for n in range(num):
print(n)
return 'Counted %s beans' % num
**再来一个重试retry的介绍,huey也是有retry,这个很是实用的东西 , 在tasks里具体函数的前面做了装饰器,装饰器里面有个func try 异常重试的逻辑 重试3次,时间间隔10秒**
# tasks.py
from datetime import datetime
from config import huey
@huey.task(retries=3, retry_delay=10)
def try_thrice():
print 'trying....%s' % datetime.now()
raise Exception('nope')
**huey是给你反悔的机会饿 ~ 也就是说,你做了deley的计划任务后,如果你又想取消,那好看,直接revoke就可以了。**
# count some beans
res = count_beans(10000000)
res.revoke()
The same applies to tasks that are scheduled in the future:
res = count_beans.schedule(args=(100000,), eta=in_the_future)
res.revoke()
@huey.task(crontab(minute='*'))
def print_time():
print datetime.now()
**定期任务
huey支持的另一个使用模式是定期执行任务。依照crontab行为,同时遵循类似的语法。定期执行的任务,不应返回有意义的结果,也不应接 受任何参数让我们添加一个每分钟打印一次字符窜的新任务——我们将使用它来测试消费者是否正在按计划执行任务**
# tasks.py
from datetime import datetime
from huey import crontab
from config import huey
@huey.periodic_task(crontab(minute='*'))
def print_time():
print(datetime.now())
c: huey_main.py 定义需要执行huey任务的方法
-l 指定huey异步任务执行时的日志文件(也可以通过ConsumerConfig的setup_logger()来定义logger)。
-w 执行器worker队列的数量
-k worker的类型(process, thread, greenlet,默认是thread)
-d 轮询队列的最短时间间隔
huey_main.py
定义需要执行huey任务的方法
再来一个真正去执行的 。 main.py 相当于生产者,tasks.py相当于消费者的关系。 main.py负责喂数据。
查看更多
请百度
https://www.jianshu.com/p/a852bc5ee8f5
4 启动时请注意
启动脚本需要依次进行以下步骤:
确保本地运行Redis
确保安装了huey
启动消费者: huey_consumer.py main.huey(注意是"main.huey"而不是"config.huey",这里提示一下huey_consumer.py需要自己从huey脚本的bin下拷贝到当前的路径,这样才能用该命令来启动。)
运行主程序: python main.py
在你下载的库中找寻这个 huey_consumer.py 文件复制到主目录
5 下面是我写的一个 task 每分钟去查询ip和port是否正常,另启动一个任务mqtt的代理
import socket
from huey import crontab
from config import huey
from main import *
import redis
redis = redis.Redis(host=‘127.0.0.1’,port=6379)
#周期 每分钟执行一次,尝试连接plc服务器是否正常
@huey.periodic_task(crontab(minute=’*/1’))
def ping_ip_port():
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(1)
try:
s.connect((‘127.0.0.1’,502))
print(‘server_port_502,ok’)
redis.set(‘key_server’,‘1’)
return ‘OK’
except Exception as e:
print('server_port_502,no')
redis.set('key_server','-1' )
return False
s.close()
@huey.task()
def mqtt_conn():
client.on_connect = on_connect
client.on_message = on_message
client.on_publish = on_publish
client.on_subscribe = on_subscribe
client.on_disconnect = on_disconnect
client.connect(HOST, PORT, 60)
time.sleep(1)
client.subscribe(“35”)
time.sleep(1)
client.loop_forever()
huey 的优点
任务队列huey 是靠着redis来实现queue的任务存储,轻量级异步任务队列。
和celery、rq一样,他的结果获取是需要在你的config.py或者主代码里面指明他的存储的方式,现在huey还仅仅是支持redis,但相对他的特点和体积,这已经很足够了 !