使用Redis构建任务队列

任务队列可以看作是消息队列的一种,只是其用于管理异步任务。任务队列有基本的在应用程序间传递,保持任务的功能。
本实训项目的主要内容是使用Redis分别构建先进先出任务队列,优先级任务队列和定时任务队列。

先进先出任务队列

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import redis

conn = redis.Redis()

# 将任务加入队列
def add_task(task_name):
    # 请在下面完成要求的功能
    #********* Begin *********#
    conn.rpush("task:list", task_name)
    #********* End *********#

# 获取一个任务
def pop_task():
    # 请在下面完成要求的功能
    #********* Begin *********#
    while True:
        task = conn.blpop("task:list", 10)
        if not task:
            continue

        return task[1]
    #********* End *********#

优先级任务队列

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-

    import redis

    conn = redis.Redis()

    # 新建任务队列/改变任务队列优先级
    def add_task_list(list_name, priority):
        # 请在下面完成要求的功能
        #********* Begin *********#
        conn.zadd("task:priority", list_name, priority)
        #********* End *********#

    # 将任务加入队列
    def add_task(list_name, task_name):
        # 请在下面完成要求的功能
        #********* Begin *********#
        conn.rpush(list_name, task_name)
        #********* End *********#

    # 获取一个任务
    def pop_task():
        # 请在下面完成要求的功能
        #********* Begin *********#
        queues = conn.zrevrange("task:priority", 0, -1)
        while True:
            task = conn.blpop(queues, 10)

            if not task:
                continue

            return task[1]
        #********* End *********#

定时任务队列

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import time
import redis

conn = redis.Redis()

# 添加定时任务
def execute_later(task_name, delay=0):
    # 请在下面完成要求的功能
    #********* Begin *********#
    if delay > 0:
        conn.zadd("task:delayed", task_name, time.time() + delay)
    else:
        conn.rpush("task:list", task_name)
    #********* End *********#

# 转移可执行任务
def pop_task():
    # 请在下面完成要求的功能
    #********* Begin *********#
    while True:
        task = conn.zrange("task:delayed", 0, 0, withscores=True)
        if not task or task[0][1] > time.time():
            time.sleep(0.01)
            continue

        task = task[0][0]

        if conn.zrem("task:delayed", task):
            conn.rpush("task:list", task)
    #********* End *********#

!!!感谢大家的支持!!!记得点赞!!!!!

猜你喜欢

转载自blog.csdn.net/weixin_44196785/article/details/109964379