def wait_for_possible_has_finish_all_tasks(queue_name: str, minutes: int, send_stop_to_broker=0, broker_kind: int = 0, ): """ 由于是异步消费,和存在队列一边被消费,一边在推送,或者还有结尾少量任务还在确认消费者实际还没彻底运行完成。 但有时候需要判断 所有任务,务是否完成,提供一个不精确的判断,要搞清楚原因和场景后再慎用。 :param queue_name: 队列名字 :param minutes: 连续多少分钟没任务就判断为消费已完成 :param send_stop_to_broker :发送停止标志到中间件,这回导致消费退出循环调度。 :param broker_kind: 中间件种类 :return: """ if minutes <= 1: raise ValueError('疑似完成任务,判断时间最少需要设置为2分钟内,最好是是10分钟') pb = get_publisher(queue_name, broker_kind=broker_kind) no_task_time = 0 while 1: # noinspection PyBroadException try: message_count = pb.get_message_count() except Exception as e: nb_print(e) message_count = -1 if message_count == 0: no_task_time += 30 else: no_task_time = 0 time.sleep(30) if no_task_time > minutes * 60: break if send_stop_to_broker: pb.publish({'stop': 1}) pb.close()
def publisher_of_same_queue(self): if not self._publisher_of_same_queue: self._publisher_of_same_queue = get_publisher(self._queue_name, consuming_function=self.consuming_function, broker_kind=self.BROKER_KIND) if self._msg_expire_senconds: self._publisher_of_same_queue.set_is_add_publish_time() return self._publisher_of_same_queue
def bulid_a_new_publisher_of_same_queue(self): return get_publisher(self._queue_name, broker_kind=self.BROKER_KIND)