xxl_queue.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. print(key, obj)
  22. result_list = None
  23. flag = False
  24. for i in range(len(self.data)):
  25. if self.data[i] is None:
  26. continue
  27. _key = self.data[i][0]
  28. _obj_list = self.data[i][1]
  29. if _key == key:
  30. if len(_obj_list) + 1 >= self.pop_threshold:
  31. r = _obj_list.copy()
  32. r.append(obj)
  33. result_list = r
  34. self.data[i] = None
  35. pass
  36. else:
  37. self.data[i][1].append(obj)
  38. pass
  39. flag = True
  40. pass
  41. pass
  42. if not flag:
  43. self._put(index=self.hand, key=key, obj=obj)
  44. pass
  45. return result_list
  46. pass
  47. def _put(self, index, key, obj):
  48. if self.data[index] is None:
  49. self.data[index] = (key, [obj])
  50. self.hand = (self.hand + 1) % self.len # 指针后移
  51. pass
  52. elif self.data[index][0] == key:
  53. self.data[index][1].append(obj)
  54. else:
  55. self.data[index] = (key, [obj]) # 覆盖当前index
  56. self.hand = (self.hand + 1) % self.len # 指针后移
  57. pass
  58. pass
  59. def get(self):
  60. ret = self.data[self.hand:]
  61. ret.extend(self.data[:self.hand])
  62. return ret
  63. if __name__ == '__main__':
  64. q = xxl_queue(pop_threshold=3, buff_size=5)
  65. print(q.append('a', '1'))
  66. print(q.append('a', '2'))
  67. print(q.append('a', '3'))
  68. print(q.append('b', '1'))
  69. print(q.append('b', '2'))
  70. print(q.append('b', '3'))
  71. print(q.append('a', '3'))
  72. print(q.append('b', '3'))
  73. print(q.append('c', '3'))
  74. print(q.append('d', '3'))
  75. print(q.append('e', '3'))
  76. print(q.append('f', '3'))
  77. print(q.append('a', '1'))
  78. print(q.append('a', '2'))
  79. pass