我正在尝试返回一个数组。
我可以将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
答案 0 :(得分:1)
此行为有两种可能的原因:
consumer
没有停止返回元素)在第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