任务需要延迟执行,可以先添加任务到redis zset类型,将到期时间写入score,任务写入member,再通过不断监听获取到期任务,删除后执行,redis是线程安全的,判断下删除状态为真执行即可
import time
import redis
import uuid
pool=redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
r=redis.Redis(connection_pool=pool)
def delay_queue(name,delay:int):
uid=str(uuid.uuid4())
r.zadd('delay_queue',{name+uid:time.time()+delay})
delay_queue('任务一',3)
delay_queue('任务二',4)
delay_queue('任务三',2)
delay_queue('任务四',6)
def execute_queue():
while 1:
queue=r.zrangebyscore('delay_queue',0,time.time())
if queue:
name=queue[0]
status=r.zrem('delay_queue',name)
if status:
print(f'开始执行任务:{name}')
time.sleep(0.1)
print(f'任务:{name} 执行结束')
else:
print('任务列表为空,等待1秒')
time.sleep(1)
continue
execute_queue()