V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
chaizz
V2EX  ›  Python

RocketMQ 的 Python 版的 SDK 内存泄漏的问题?

  •  
  •   chaizz · 2023-08-24 09:56:30 +08:00 · 1541 次点击
    这是一个创建于 490 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位大佬有用过 RocketMQ 的 Python 版的 SDK 吗? 我在使用生产者循环发消息的的时候,内存一直在缓慢上升,不知道是不是使用不当造成的。

    Python 版本:3.8.17
    rocketmq-client-python 版本:2.0.1rc1 (自己下载的master分支下手动安装的)

    代码:

    def send_message(producer, body):
        try:
            message = Message("test")
            message.set_body(json.dumps(body))
            result = producer.send_sync(message)
            print(f"生产者发送消息状态: {str(result.status)} 消息 ID: {result.msg_id}, offset: {result.offset}")
            del result
        except Exception as e:
            print(f"生产者发送消息失败:{repr(e)}")
    
        finally:
            del message
            gc.collect()
    
    def producer():
        ROCKETMQ_HOST = os.getenv("ROCKETMQ_HOST")
        ROCKETMQ_PORT = os.getenv("ROCKETMQ_PORT")
        ROCKETMQ_ACCESS_KEY = os.getenv("ROCKETMQ_ACCESS_KEY")
        ROCKETMQ_ACCESS_SECRET = os.getenv("ROCKETMQ_ACCESS_SECRET")
    
        producer = Producer('algo-producer')
        producer.set_name_server_address(f"{ROCKETMQ_HOST}:{ROCKETMQ_PORT}")
        producer.set_session_credentials(ROCKETMQ_ACCESS_KEY, ROCKETMQ_ACCESS_SECRET, "")
        producer.start()
    
        try:
            while True:
                body = {"a":'x'}
                send_message(producer,json.dumps(body))
                time.sleep(0.2)
        except KeyboardInterrupt:
            print("退出")
        finally:
            producer.shutdown()
    
    
    
    if __name__ == '__main__':
        producer()
    
    
    10 条回复    2023-09-01 09:22:07 +08:00
    julyclyde
        1
    julyclyde  
       2023-08-24 12:54:17 +08:00
    1 不过为啥你要 json.dumps 两遍呢?
    2 gc.collect()似乎不是什么必须写的句子啊,send_message 函数完成的时候,message 变量自然会消失的
    3 能不能试试销毁重建 producer 变量?
    chaizz
        2
    chaizz  
    OP
       2023-08-24 17:25:00 +08:00
    @julyclyde
    1 、这是我复制代码的时候复制错了。实际代码没有 dumps 两遍。
    2 、gc.collect() 确实不是必须写语句, 我是确认在手动 gc 之后,仍然会有内存攀升的问题。
    3 、这种做法我之前也试过,我在重新测试测试。
    感谢回答~
    julyclyde
        3
    julyclyde  
       2023-08-25 14:54:05 +08:00
    @chaizz 我之前遇到类似的内存泄漏,调了 numpy ,但是无法证明因果关系。gc 同样无效。我怀疑是漏在外面的库里,而不是 python 这边
    chaizz
        4
    chaizz  
    OP
       2023-08-25 17:46:33 +08:00
    @julyclyde #3 经过我测试确实是这个 sdk 的问题,他是调用的 CPP 的接口。
    julyclyde
        5
    julyclyde  
       2023-08-27 18:57:05 +08:00
    @chaizz 找到证据了嘛?
    chaizz
        6
    chaizz  
    OP
       2023-08-28 09:38:38 +08:00   ❤️ 1
    @julyclyde #5 我使用 memory_profiler 查看了一下,发现应该是生成 producer 时候和销毁 producer 时内存消耗不一致,估计是 producer 在销毁时还有其他的对象没有被销毁导致的。
    NoAnyLove
        7
    NoAnyLove  
       2023-08-29 12:11:56 +08:00
    先上 tracemalloc 判断是不是 Python 对象的泄露
    Ranglage
        8
    Ranglage  
       2023-09-01 08:00:44 +08:00
    问题解决了么?内存泄漏出在哪里? python 还是 rocketmq ?
    chaizz
        9
    chaizz  
    OP
       2023-09-01 09:22:00 +08:00
    @NoAnyLove 测试了一下应该是 rocketmq 的问题,生产者在销毁的时候,没有清除对应的内存。
    chaizz
        10
    chaizz  
    OP
       2023-09-01 09:22:07 +08:00
    @Ranglage 测试了一下应该是 rocketmq 的问题,生产者在销毁的时候,没有清除对应的内存。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:20 · PVG 14:20 · LAX 22:20 · JFK 01:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.