最后的python代码没有运行

时间:2014-11-03 13:58:22

标签: python

我正在尝试返回一个数组。

我可以将messages数组打印到控制台,我可以看到它被填充了。 然而,最终看起来无法访问的代码。我做错了什么?

def kafka_messages(topic, partition):
    messages = []

    try:
        consumer = SimpleConsumer(kafka, b"consumer-group"
                                  , bytes(topic, "UTF-8")
                                  , partitions=[partition])
        consumer.provide_partition_info()
        consumer.seek(0, 0)

        for message in consumer:
            messages.append(message) # Messages has values

    finally:
        if kafka:
            kafka.close()

    print(messages) # Never even gets run
    return messages

2 个答案:

答案 0 :(得分:1)

此行为有两种可能的原因:

  1. 循环没有终止(即consumer没有停止返回元素)
  2. 代码抛出异常。
  3. 在第print('Loop terminated')行之前添加finally:,以确定循环是否终止。

    如果不是,那么您需要阅读SimpleConsumer的文档,以了解如何检查它是否有更多元素,以便终止循环。

    [编辑] 查看source for SimpleConsumer,当没有消息但代码看起来很奇怪/破坏时,似乎有超时(默认为ITER_TIMEOUT_SECONDS) :如果iter_timeout is None,则代码将休眠,循环永远不会终止。

    因此,在创建实例时尝试将iter_timeout设置为较小的值,并且循环应该停止。

答案 1 :(得分:0)

这是我做的:

def kafka_messages(topic, partition):
    messages = []

    try:
        consumer = SimpleConsumer(kafka, b"consumer-group"
                                  , bytes(topic, "UTF-8")
                                  , partitions=[partition])
        consumer.provide_partition_info()
        consumer.seek(0, 0)
        pending = consumer.pending(partitions=[partition]) # Comes with the API being used

        count = 1
        for message in consumer:
            if count == pending:
                break # Simply break out when you have iterated through all the items
            messages.append(message)
            count += 1

    finally:
        if kafka:
            kafka.close()

    return messages