Advertisement

使用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 *********#

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

全部评论 (0)

还没有任何评论哟~