记一次python消费kafka进程持续消耗内存问题

前提:python写了一个kafka消费的脚本,脚本中消费kafka消息并将消费到的数据放在一个线程池中进行业务代码处理,使用supervisor管理这个脚本进程

遇到问题:这个进程占用的内存会越来越大,知道将机器内存消耗完

排查:网上找了一堆内存分析工具,好像都需要预埋代码,或者重新启动一个进程,全扯淡。

解决:读取kafka消息的代码添加一个计数器,没消费一个kafka消息加1,累计处理10000次请求,执行一次线程池重启和主动gc

import gc
from concurrent.futures import ThreadPoolExecutor

def process_message(args):
    pass

def consume_kafka_data(topic):
    kafka_servers = []
    consumer = KafkaConsumer(topic, bootstrap_servers=kafka_servers, auto_offset_reset='latest', enable_auto_commit=False)
    for message in consumer:
        yield message.value

if __name__ == "__main__":
    topic = ""
    executor = ThreadPoolExecutor(max_workers=10)
    for value in consume_kafka_data(topic):
        try:
            args = json.loads(value.decode('utf-8'))
            executor.submit(process_message, args)
            if index > 100000:
                index = 0
                logger.info("关闭线程池")
                executor.shutdown(wait=True)
                logger.info("gc 回收")
                gc.collect()
                logger.info("开启线程池")
                executor = ThreadPoolExecutor(max_workers=10)
            index += 1
        except Exception as exception:
            logger.exception(exception)

 

posted @ 2023-07-03 16:43  一个和🔥有缘的人  阅读(219)  评论(0编辑  收藏  举报