• python下使用redis实现一个简单的队列


    使用 redis 构建一个简单的多生产者、多消费者 Queue,其接口类似于 python 标准库队列。
    使用这个队列,可以轻松地在多个进程之间共享数据,或者将耗时的计算放到多个进程。
     
    为了存储数据,我们使用redis列表数据类型。Redis 列表存储的是按插入顺序排序的简单字符串。
    redis用到的命令:

    rpush 在列表的末尾插入一个元素
    blpop 从列表开头获取一个元素,如果列表是空则 阻塞
    lpop 从列表开头获取一个元素,如果列表是空 则返回空
    llen 返回列表的长度

    import redis
    
    class RedisQueue(object):
        """Simple Queue with Redis Backend"""
        def __init__(self, name, namespace='queue', **redis_kwargs):
            """The default connection parameters are: host='localhost', port=6379, db=0"""
           self.__db= redis.Redis(**redis_kwargs)
           self.key = '%s:%s' %(namespace, name)
    
        def qsize(self):
            """Return the approximate size of the queue."""
            return self.__db.llen(self.key)
    
        def empty(self):
            """Return True if the queue is empty, False otherwise."""
            return self.qsize() == 0
    
        def put(self, item):
            """Put item into the queue."""
            self.__db.rpush(self.key, item)
    
        def get(self, block=True, timeout=None):
            """Remove and return an item from the queue. 
    
            If optional args block is true and timeout is None (the default), block
            if necessary until an item is available."""
            if block:
                item = self.__db.blpop(self.key, timeout=timeout)
            else:
                item = self.__db.lpop(self.key)
    
            if item:
                item = item[1]
            return item
    
        def get_nowait(self):
            """Equivalent to get(False)."""
            return self.get(False)

    用法:

    >>> from RedisQueue import RedisQueue
    >>> q = RedisQueue('test')
    >>> q.put('hello world')
    

    现在如果我们用redis-cli客户端查看一下redis数据库,就会显示出预期的结果。

    redis 127.0.0.1:6379> keys *
    1) "queue:test"
    redis 127.0.0.1:6379> type queue:test
    list
    redis 127.0.0.1:6379> llen queue:test
    (integer) 1
    redis 127.0.0.1:6379> lrange queue:test 0 1
    1) "hello world"
    

    我们可以从另一个脚本中得到这个条目:

    >>> from RedisQueue import RedisQueue
    >>> q = RedisQueue('test')
    >>> q.get()
    'hello world'
    

    接下来的 q.get ()调用将阻塞,直到另一个调用将新项放入 Queue。  

      

      

      

    参考:

    http://peter-hoffmann.com/2012/python-simple-queue-redis-queue.html

  • 相关阅读:
    Ubuntu使用命令行打印文件
    Spring ConditionalOnProperty
    Spring EnableWebMvc vs WebMvcConfigurationSupport
    commons-httpclient中的超时设置
    jdb调试命令
    caching redirect views leads to memory leak (Spring 3.1)
    Clojure web初探
    在现有原生开发Android项目中集成hbuilder开发
    MessageBoard
    CSS布局(五) 圣杯布局
  • 原文地址:https://www.cnblogs.com/jeff-ideas/p/10540360.html
Copyright © 2020-2023  润新知