Huey后台异步任务

huey作为django中间件,只能在django启动后才能启动huey消费者进程,每次重启django都需要再重启huey
遇到闪退看不到错误,可到cmd中运行查看错误

安装
pip install huey 主程序
pip install gevent 绿色线程,windows下不好用

#启动处理进程,阻塞型只同时处理单个任务
huey_consumer.py tasks.huey #tasks文件里的huey对象

完整的非阻塞多后台

#启动消费者进程,允许10个携程,也就是能同时运行的后台程序个数,超过将阻塞等待运行
huey_consumer.py tasks.huey -w 40 -k greenlet #多后台非阻塞

huey_consumer.py tasks.huey -w 2 #默认启动2个线程,最稳定

#注意重启消费者要在home/www目录
nohup huey_consumer.py tasks.huey -w 40 -k greenlet &注意要在cd /home/www目录 #服务器后台运行 第一次要先运行一次消费者,并将生成的db文件设置为读写
tail -f nohup.out #查看输出命令
pkill -f huey_consumer.py #结束所有huey_consumer.py进程
ps aux | grep huey_consumer.py #查看所有进程
#如果出现grep 的进程说明是你当前搜索huey的进程本身
kill PID 退出进程
#这里的-k有三种:
thread:线程 #性能和效率最平衡,可以十多个
process:进程 #执行占用CPU大的工作,重量级,只能开几个
greenlet:携程 #执行IO阻塞等待,且不占用大量CPU的适合,非常轻量级可以开上百个

后台模块tasks.py

from gevent import monkey; monkey.patch_all()  #必要的猴子补丁
from huey import SqliteHuey  #存储方式库
from gevent import sleep  #非阻塞延时

huey = SqliteHuey(filename='demo.db')

#调用执行任务
@huey.task()
def add(a):
    for i in range(5):
        b = datetime.now()
        print(f'{a}:开始循环中,第{i}次,当前时间{b}')
        sleep(2)

#定时任务1分钟一次
@huey.periodic_task(crontab(minute='*/1'))
def test():
    print('哈哈')

定时任务

crontab参数:
minute 分
hour 小时
day 天
month 月
day_of_week (0=周日, 6=周六)

主程序调用mian.py:

from tasks import add

#把两个add函数同时放进进程池,将会同时运行
add('aaaa')
add('bbbb')

任务调度

main.py 文件调用的时候可以

from tasks import add, huey  #导入huey模块里的add函数

#间隔时间运行
r = add.schedule((3, 4), delay=10) #10秒后运行
sleep(1)
print(r(blocking=True))  #堵塞,将等待结果后再返回


#指定时间运行
from datetime import datetime,timedelta

eta = datetime.now() + timedelta(seconds=10) #10秒后
r = add.schedule((4, 5), eta=eta)  #指定时间运行
print(r(blocking=True))

#添加任务到列队:
b = huey.enqueue(add.s('bbbb'))
huey.enqueue(add.s('aaa',priority=5)) #优先级5
#设置超时,如果超过时间还未执行则丢弃
huey.enqueue(add.s('ccc',priority=1,expires=timedelta(seconds=5)))

停止任务

huey.revoke_by_id(id) #通过任务ID去结束还未运行的任务

systemd系统服务启动

pip show huey查找huey的路径
#ubuntu可能在/usr/local/lib/python3.6/dist-packages/huey/bin/huey_consumer.py

#创建一个名为huey.service的服务单元文件,并使用 root 用户在/etc/systemd/system/目录下进行保存

[Unit]
Description=huey
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/www/
ExecStart=/路径/huey/bin/huey_consumer.py tasks.huey -w 40 -k greenlet
Restart=always

[Install]
WantedBy=multi-user.target

#重新加载systemd配置
systemctl daemon-reload

#启动gunicorn服务单元,启动前需要确保已经上传好了web程序,并且配置要和web程序的对象对应
systemctl start huey
#检查运行状态
systemctl status huey

#查看错误日志
journalctl -u huey.service
#重启gunicorn服务单元,重启前需要删除主py文件里的run调试
systemctl restart huey

#停止gunicorn
systemctl stop huey

官方文档:

https://huey.readthedocs.io/en/latest/guide.html#scheduling-tasks

闪退处理

首先检查调用的自写包是否使用了 ..
如果还闪退,在cmd命令中 打开路径,然后切换到当前Python环境(如果使用了),
如果cmd无效,也可以使用类似
python venv\Scripts\huey_consumer.py app.task.huey -w 40 -k greenlet
python解释器直接运行huey_consumer.py文件来获得错误

python venv\Scripts\huey_consumer.py task.huey -w 2 -k greenlet
python venv\Scripts\huey_consumer.py task.huey -w 2 使用线程