【发布时间】:2019-08-09 20:43:39
【问题描述】:
当我使用 Flask 应用程序启动多个 docker 容器时,我遇到了一个奇怪的问题。带有应用程序的容器用于模拟目的,而不是部署用于生产,我只需要一种方法来允许 docker 容器相互通信,并且 GET/POST API 调用似乎是一个很好的解决方案。然而,这就是我的问题发生的地方,当我启动容器并且 Flask 应用程序启动时,内存使用量(我用htop 观察)开始增加。只需启动 Flask 服务器,容器大小就会增加 200 MB。老实说,我可以接受这一点,但问题是,在每次 API 调用之后,内存使用量都在不断增加。这是其中一个功能的小sn-p:
@app.route('/execute/step=<int:step>', methods=['GET'])
def execute(step):
url = f'http://my_url:5000/some/api/call/step={step}'
response = requests.get(url)
data = eval(response.text)
if data:
# unimportant calculations
if demand <= supply:
for b in people_b:
buyer_id = b['id']
post_data = {some_data}
url = f'http://my_url:5000/set_data/id={buyer_id}'
requests.post(url, data=post_data)
for s in people_s[:-1]:
seller_id = s['id']
post_data = {some_data
}
url = f'http://my_url:5000/set_data/id={seller_id}'
requests.post(url, data=post_data)
# unimportant steps
seller_id = local_ids[-1]['id']
post_data = {some_data}
url = f'http://my_url:5000/set_data/id={seller_id}'
requests.post(url, data=post_data)
return 'Success\n'
else:
for s in people_s:
seller_id = s['id']
post_data = {some_data}
url = f'http://my_url:5000/set_data/id={seller_id}'
requests.post(url, data=post_data)
for b in people_b[:-1]:
#unimportant steps
buyer_id = b['id']
post_data = {some_data}
url = f'http://my_url:5000/set_data/id={buyer_id}'
requests.post(url, data=post_data)
#unimportant steps
buyer_id = people_b[-1]['id']
post_data = {some_data}
url = f'http://my_url:5000/set_data/id={buyer_id}'
requests.post(url, data=post_data)
return 'Success\n'
else:
return 'No success\n'
以上是其中一种方法,我删除了一些不重要的计算步骤,但我想展示的是,还有嵌套的 API 调用。我尝试在每次返回函数之前调用gc.collect(),但是没有成功。
在执行如此多的 API 调用时是否会出现这种行为,或者是否存在实施或 docker/Flask 使用问题?
【问题讨论】:
-
看起来
response.text可能是这里的问题:stackoverflow.com/questions/24656207/… -
尝试使用
response.content(或一些虚拟内容)运行,看看是否有相同的内存泄漏? -
eval是邪恶的。不习惯!使用 JSON! -
我还没有完全意识到,如果我使用
response.json()和response.content会有什么区别。显然使用response.text和eval()不是最优的,但是另外两个呢? -
无论如何,我删除了
eval和response.text并且内存泄漏消失了。如果有人发布答案,我很乐意接受。