xxl_queue.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. # -*- coding: utf-8 -*-
  2. # @Time : 2022/12/2 9:19
  3. # @Author : XuJiakai
  4. # @File : xxl_queue
  5. # @Software: PyCharm
  6. class xxl_queue:
  7. def __init__(self, pop_threshold, buff_size=100):
  8. """
  9. 类似于开心消消乐的定长队列,攒够阈值,则弹出数据
  10. 注意:该队列目前不能按照最新插入时间,调整覆盖
  11. :param pop_threshold: 弹出数据阈值
  12. :param buff_size: 缓冲区大小
  13. """
  14. assert isinstance(buff_size, int) and buff_size > 0, "请给我一个大于零的整数来指定长度"
  15. self.len = buff_size
  16. self.data = [None] * self.len
  17. self.hand = 0
  18. self.pop_threshold = pop_threshold
  19. pass
  20. def append(self, key, obj):
  21. result_list = None
  22. flag = False
  23. for i in range(len(self.data)):
  24. if self.data[i] is None:
  25. continue
  26. _key = self.data[i][0]
  27. _obj_list = self.data[i][1]
  28. if _key == key:
  29. if len(_obj_list) + 1 >= self.pop_threshold:
  30. r = _obj_list.copy()
  31. r.append(obj)
  32. result_list = r
  33. self.data[i] = None
  34. pass
  35. else:
  36. self.data[i][1].append(obj)
  37. pass
  38. flag = True
  39. pass
  40. pass
  41. if not flag:
  42. self._put(index=self.hand, key=key, obj=obj)
  43. pass
  44. return result_list
  45. pass
  46. def _put(self, index, key, obj):
  47. if self.data[index] is None:
  48. self.data[index] = (key, [obj])
  49. self.hand = (self.hand + 1) % self.len # 指针后移
  50. pass
  51. elif self.data[index][0] == key:
  52. self.data[index][1].append(obj)
  53. else:
  54. self.data[index] = (key, [obj]) # 覆盖当前index
  55. self.hand = (self.hand + 1) % self.len # 指针后移
  56. pass
  57. pass
  58. def get(self):
  59. ret = self.data[self.hand:]
  60. ret.extend(self.data[:self.hand])
  61. return ret
  62. if __name__ == '__main__':
  63. q = xxl_queue(pop_threshold=3, buff_size=5)
  64. print(q.append('a', '1'))
  65. print(q.append('a', '2'))
  66. print(q.append('a', '3'))
  67. print(q.append('b', '1'))
  68. print(q.append('b', '2'))
  69. print(q.append('b', '3'))
  70. print(q.append('a', '3'))
  71. print(q.append('b', '3'))
  72. print(q.append('c', '3'))
  73. print(q.append('d', '3'))
  74. print(q.append('e', '3'))
  75. print(q.append('f', '3'))
  76. print(q.append('a', '1'))
  77. print(q.append('a', '2'))
  78. pass