我正在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')
添加最后一行“解决了”问题。为什么?我比以前更困惑