Kafka生产者在另一个进程中似乎无法在Python中工作

时间:2019-03-04 11:14:32

标签: python multithreading apache-kafka multiprocessing microservices

我正在python中运行微服务,该服务为每种消息实现了多个处理程序。

class MsFeatureLandmark(BaseMicroservice):

    def __init__(self):
        self.config = safe_load(open(sys.argv[1]))
        client = MongoClient(self.config.get('mongo').get('connection_url'))
        database = client[self.config.get('mongo').get('mongo_db')]
        self.dict = {
            MessageType.create_model.name: ComputeLocDescHandler(self.config),
            MessageType.detect_all.name: ExtractFeatureHandler(self.config, database),
            MessageType.detect_landmark.name: ExtractFeatureHandler(self.config, database)

        }
        super().__init__(self.dict, self.config.get('kafka'))

    def on_message_received(self, generic_message):
        # self.dict.get(generic_message.metadata_type).handle(generic_message.message)
        p = Process(target=self.dict.get(generic_message.metadata_type).handle, args=(generic_message.message,))
        p.daemon = True
        p.start()


MsFeatureLandmark().run()

在收到的每条消息上,我都会启动相应的.handle()方法。

在计算结束时(涉及张量流),我使用从超类继承的方法来使用kafka发送消息

def write_message(self, message):
    if(self.is_prod_init):
        output_topic = self.config.get('kafka').get('output_topic')
        cl.logging.info("Sending on " + output_topic + " message: " + str(message))
        self.producer.send(output_topic, message)
    else:
        raise ValueError('Producer is not initialized.')

def init_producer(self):
    self.producer = KafkaProducer(bootstrap_servers=self.config.get('kafka').get('bootstrap_servers'),
                                  value_serializer=lambda m: json.dumps(m).encode('utf-8'))
    self.is_prod_init = True
    self.producer.flush()

当我以同步方式运行所有这些代码(不使用Process(target = self.etc。))时,一切正常,但是由于处理数据的时间太长,生产者超时。

如果我使用Process运行它,我不会收到任何错误消息,但是生产者似乎出于任何原因都不会产生任何消息。

我想念什么?

编辑:由于某种原因,我上次运行此微服务时,发生了异常,并且使用者(在另一个进程中运行)成功读取了消息。这让我感到奇怪:如果引发异常,是否会发送消息?是的。

    self.write_message(message)
    raise Exception('spakkiggnustel')

添加最后一行“解决了”问题。为什么?我比以前更困惑

0 个答案:

没有答案