Python 带有Flask服务器的Docker容器在大约20个请求后停止响应
我有一个docker容器,它接收图像的URL,使用Python 带有Flask服务器的Docker容器在大约20个请求后停止响应,python,docker,flask,tensorflow,flask-restful,Python,Docker,Flask,Tensorflow,Flask Restful,我有一个docker容器,它接收图像的URL,使用urllib2将图像下载到内存中,使用Tensorflow对其进行一些处理,然后返回JSON数据 代码的结构如下所示: myapp.py from flask import Flask from flask_restful import reqparse, abort, Api, Resource, inputs import my_tensorflow app = Flask(__name__) api = Api(app) parser =
urllib2
将图像下载到内存中,使用Tensorflow对其进行一些处理,然后返回JSON数据
代码的结构如下所示:
myapp.py
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, inputs
import my_tensorflow
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('url')
class MyApp(Resource):
def post(self):
c = my_tensorflow.MyTensorflow(args['url'])
c.create_graph()
returned = c.run_inference_on_image()
return {'results': returned}
api.add_resource(MyApp, '/myapp')
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
import numpy as np
import tensorflow as tf
import urllib2
class MyTensorflow:
def __init__(self, url):
self.imageUrl = imageUrl
def create_graph(self):
with tf.gfile.FastGFile("/path/to/model.pb", 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
def run_inference_on_image(self):
image_string = urllib2.urlopen(self.imageUrl).read()
with tf.Session() as sess:
...
...
return a_text_value
my_tensorflow.py
from flask import Flask
from flask_restful import reqparse, abort, Api, Resource, inputs
import my_tensorflow
app = Flask(__name__)
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('url')
class MyApp(Resource):
def post(self):
c = my_tensorflow.MyTensorflow(args['url'])
c.create_graph()
returned = c.run_inference_on_image()
return {'results': returned}
api.add_resource(MyApp, '/myapp')
if __name__ == '__main__':
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)
import numpy as np
import tensorflow as tf
import urllib2
class MyTensorflow:
def __init__(self, url):
self.imageUrl = imageUrl
def create_graph(self):
with tf.gfile.FastGFile("/path/to/model.pb", 'rb') as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
_ = tf.import_graph_def(graph_def, name='')
def run_inference_on_image(self):
image_string = urllib2.urlopen(self.imageUrl).read()
with tf.Session() as sess:
...
...
return a_text_value
这个容器可以处理大约20个请求。在大约20个请求之后,它停止响应,只响应“内部服务器错误”。我似乎无法解决这个问题。我在代码中输入print语句以查看它在哪里变得无响应或出错,但没有一个print语句显示在docker日志中
docker日志
没有显示任何有趣的内容。下面是它显示的内容:
172.17.42.1 - - [13/Feb/2017 21:12:02] "POST /myapp HTTP/1.1" 500 -
当容器变得无响应时(响应为内部服务器错误
),docker stats
返回以下信息:
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O
docker_container 0.01% 2.475 GB/8.255 GB 29.99% 5.328 MB/2.036 MB
使用docker restart
重新启动容器后,一切都会重新开始工作
我不确定会出现什么问题以及如何解决问题?可能
docker events
会显示一些内容尝试在交互模式下运行容器(而不是运行分离并使用docker logs
查看日志)。运行分离时,输出会被缓冲,并且(以我的经验来说)有时会丢失一些东西,或者挂起并永远不会打印,因为缓冲区不够满。当运行attached时,您没有缓冲问题。是的,我也会尝试从容器中运行,看看这是否是docker网络问题。您可以在运行容器时使用--net=host
来使用主机网络堆栈(即没有网络名称空间)。