各位大佬有用过 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()
1
julyclyde 2023-08-24 12:54:17 +08:00
1 不过为啥你要 json.dumps 两遍呢?
2 gc.collect()似乎不是什么必须写的句子啊,send_message 函数完成的时候,message 变量自然会消失的 3 能不能试试销毁重建 producer 变量? |
2
chaizz OP @julyclyde
1 、这是我复制代码的时候复制错了。实际代码没有 dumps 两遍。 2 、gc.collect() 确实不是必须写语句, 我是确认在手动 gc 之后,仍然会有内存攀升的问题。 3 、这种做法我之前也试过,我在重新测试测试。 感谢回答~ |
3
julyclyde 2023-08-25 14:54:05 +08:00
@chaizz 我之前遇到类似的内存泄漏,调了 numpy ,但是无法证明因果关系。gc 同样无效。我怀疑是漏在外面的库里,而不是 python 这边
|
6
chaizz OP @julyclyde #5 我使用 memory_profiler 查看了一下,发现应该是生成 producer 时候和销毁 producer 时内存消耗不一致,估计是 producer 在销毁时还有其他的对象没有被销毁导致的。
|
7
NoAnyLove 2023-08-29 12:11:56 +08:00
先上 tracemalloc 判断是不是 Python 对象的泄露
|
8
Ranglage 2023-09-01 08:00:44 +08:00
问题解决了么?内存泄漏出在哪里? python 还是 rocketmq ?
|