python huey 轻量级消息队列

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的代理

-- coding: UTF-8 --

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()

python huey 轻量级消息队列_第1张图片
huey 的优点
任务队列huey 是靠着redis来实现queue的任务存储,轻量级异步任务队列。
和celery、rq一样,他的结果获取是需要在你的config.py或者主代码里面指明他的存储的方式,现在huey还仅仅是支持redis,但相对他的特点和体积,这已经很足够了 !

你可能感兴趣的:(python huey 轻量级消息队列)