如何获取零容量的队列容量和负载

时间:2019-05-05 12:54:13

标签: python zeromq

我在zeromq中具有发布者订阅者体系结构。我使用python。

我需要能够分辨出一些队​​列何时将太满,并且最好能够对此做些什么。

我必须能够知道消息是否丢失。

但是,我无法找到与此主题相关的文档。

希望得到一些帮助

谢谢!

1 个答案:

答案 0 :(得分:0)

这是我所做的摘要

def _flush_zmq_into_buffer(self):
    # poll zmq for new messages. if any are found, put all possible items from zmq to self.buffer
    # if many readers, need to use a read-write lock with writer priority
    # http://code.activestate.com/recipes/577803-reader-writer-lock-with-priority-for-writers/
    while True:
        self._iteration += 1
        self._flush_zmq_once()
        sleep(0.005)

def _take_work_from_buffer(self):
    while True:
        try:
            if self._buffer.qsize() > 0:
                work_message = self._buffer.get(block=True)
                # can't have any heavy operation here! this has to be as lean as possible!
            else:
                sleep(0.01)
                continue
        except queue.Empty as ex:
            sleep(0.01)
            continue

        self._work_once(work_message)

def _flush_zmq_once(self):
    self.__tick()

    flushed_messages = 0
    for i in range(self.max_flush_rate):
        try:
            message = self._parse_single_zmq_message()
            self._buffer.put(message, block=True)  # must block. can't lose messages.
        except zmq.Again:  # zmq empty
            flushed_messages = i
            break

    self._log_load(flushed_messages)

    self.__tock()
    self.__print_flushed(flushed_messages)

这使我可以比解析消息快得多的速度将zmq缓冲区刷新到自己的缓冲区中,这样就不会丢失任何消息,并且需要支付延迟。

这也使我知道每个刷新周期从zmq刷新了多少条消息,从而了解了负载。

之所以使用轮询事件,是因为对于大量传入消息,事件系统比轮询系统的成本更高。最后一句话未经测试,但我相信这是真的。