Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 卡夫卡python:关闭卡夫卡生成器时超时为0 vs inf secs_Python 2.7_Kafka Producer Api_Kafka Python - Fatal编程技术网

Python 2.7 卡夫卡python:关闭卡夫卡生成器时超时为0 vs inf secs

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

我正在尝试使用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_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中解释器终止?

感谢通过更新提供的解决方案!感谢通过更新提供的解决方案!