Python 2.7 卡夫卡python:关闭卡夫卡生成器时超时为0 vs inf secs
我正在尝试使用Kafka python 2.0.1和python 2.7为Kafka主题生成消息(由于某些与工作场所相关的限制,无法使用python 3) 我在一个单独的包中创建了一个类,如下所示,并编译了该包并安装在虚拟环境中:Python 2.7 卡夫卡python:关闭卡夫卡生成器时超时为0 vs inf secs,python-2.7,kafka-producer-api,kafka-python,Python 2.7,Kafka Producer Api,Kafka Python,我正在尝试使用Kafka python 2.0.1和python 2.7为Kafka主题生成消息(由于某些与工作场所相关的限制,无法使用python 3) 我在一个单独的包中创建了一个类,如下所示,并编译了该包并安装在虚拟环境中: import json from kafka import KafkaProducer class KafkaSender(object): def __init__(self): self.producer = self.get_kafk
import json
from kafka import KafkaProducer
class KafkaSender(object):
def __init__(self):
self.producer = self.get_kafka_producer()
def get_kafka_producer(self):
return KafkaProducer(
bootstrap_servers=['locahost:9092'],
value_serializer=lambda x: json.dumps(x),
request_timeout_ms=2000,
)
def send(self, data):
self.producer.send("topicname", value=data)
我的驱动程序代码如下所示:
from mypackage import KafkaSender
# driver code
data = {"a":"b"}
kafka_sender = KafkaSender()
kafka_sender.send(data)
场景1:我运行这段代码,它运行得很好,没有错误,但是消息没有被推送到主题。我已经确认了这一点,因为在本主题中,偏移或滞后不会增加。此外,消费端没有记录任何内容 场景2:
从
\uuuu init\uuuu
方法中注释/删除了Kafka producer的初始化。我把发送线路从
self.producer.send(“topicname”,value=data)
发送到self.get\u kafka\u producer().send(“topicname”,value=data)
即在将消息发送到topic之前,不提前创建kafka producer(在类初始化期间)。当我运行代码时,它工作得非常好。消息已发布到主题中
我使用场景1的目的是创建一个卡夫卡制作人,一次使用,多次使用,而不是每次发送消息时都创建卡夫卡制作人。这样,如果我需要发送数百万条消息,我可能最终会创建数百万个Kafka producer对象
你能帮我理解卡夫卡制作人为什么这样做吗
注意:如果我把卡夫卡代码和驱动程序代码写在同一个文件中,就可以了。只有当我在单独的包中编写卡夫卡代码,编译并导入到另一个项目中时,它才起作用
日志:
更新1:2020年5月9日17:20:已从问题描述中删除信息日志。我启用了调试级别,下面是第一个场景和第二个场景之间调试日志的区别 更新2:2020年5月9日21:28:
在进一步调试和查看python kafka源代码后,我推断在场景1中,kafka发送器被强制关闭,而在场景2中,kafka发送器被优雅地关闭
def initiate_close(self):
"""Start closing the sender (won't complete until all data is sent)."""
self._running = False
self._accumulator.close()
self.wakeup()
def force_close(self):
"""Closes the sender without sending out any pending messages."""
self._force_close = True
self.initiate_close()
这取决于卡夫卡制作人的close()
方法是在超时为0(强制关闭发送方)的情况下调用的,还是在没有超时的情况下调用的(在这种情况下,超时取值float('inf')
并调用发送方的优雅关闭)
Kafka producer的close()
方法是从垃圾收集时调用的方法调用的<代码>关闭(0)
方法正在从注册到atexit
的方法调用,该方法在调用时被调用。问题是为什么在场景1中解释器终止?感谢通过更新提供的解决方案!感谢通过更新提供的解决方案!