-
Notifications
You must be signed in to change notification settings - Fork 0
/
queue.py
94 lines (80 loc) · 2.23 KB
/
queue.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
class Queue(object):
def __init__(self,qname):
super(Queue, self).__init__()
self.qname = qname
def put(self,value):
'''
入队列默认到
'''
pass
def get(self):
'''
出队列
'''
pass
def status(self):
'''
返回对了状态
子类自己实现自己的方式
'''
def clear(self,start=None,end=None):
'''
清除队列
可以指定开始和结束位置
'''
pass
def iter(self):
pass
def is_in_queue(self,value):
'''
值在不在队列中
'''
pass
def get_queue_name(self):
return self.qname
def removevalue(self,value):
pass
class RedisFifoQueue(Queue):
def __init__(self,qname,max_size=0):
'''
max_size : 队列最大允许长度
'''
super(Queue, self).__init__()
self.qname = qname
self.max_size = max_size
def size(self):
return queue_redis.llen(self.qname)
def put(self,value):
'''
由于是异步操作,该队列不能保证绝对的最大允许长度,但也差不多
'''
if self.max_size > 0 and self.size() >= self.max_size:
return False
else:
queue_redis.rpush(self.qname, value)
return True
def pop(self):
return queue_redis.lpop(self.qname)
def remove(self,value):
return queue_redis.lrem(self.qname, value)
def peep(self):
'''
返回队首的元素,但不remove
'''
_first = queue_redis.lrange(self.qname, 0, 0)
return _first[0] if _first else None
def locate(self,value):
'''
返回该元素在队列中第一次出现的位置,如果未找到,则返回-1
'''
elems = queue_redis.lrange(self.qname, 0, -1)
loc = -1
index = -1
for elem in elems:
index += 1
if elem == value:
loc = index
break
return loc
def clear(self):
queue_redis.delete(self.qname)