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
#停止gunicornsystemctl 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
使用线程