在之前的文章模型可视化:TensorBoard:模型解析流程中介绍了关于TensorBoard对于Event文件的解析过程。今天就接着说说,在Event文件解析完成之后,TensorBoard是怎么启动服务器来提供访问能力的。
TensorBoard自带一个服务器,即Werkzeug。用于对前端提供服务。Werkzeug是一个Python功能全面的WSGI web app库。Werkzeug是德语中“工具”的意思,它可以由程序员决定使用哪种模板引擎、数据库适配器,甚至是决定如何处理请求消息。它可以用于许多web 应用中,例如博客、百科词条、布告栏等。Flask也对其进行了封装,用于处理WSGI的细节内容。这里是其项目GitHub主页地址。
TensorBoar中的服务构造的继承关系如图所示:
在调用serve_forever()
这个函数之后,最终会调用到其基类BaseServer
中的serve_forever()
,启动一个永久服务直到被关闭。
def serve_forever(self, poll_interval=0.5):
"""Handle one request at a time until shutdown.
Polls for shutdown every poll_interval seconds. Ignores
self.timeout. If you need to do periodic tasks, do them in
another thread.
"""
self.__is_shut_down.clear()
try:
# XXX: Consider using another file descriptor or connecting to the
# socket to wake this up instead of polling. Polling reduces our
# responsiveness to a shutdown request and wastes cpu at all other
# times.
with _ServerSelector() as selector:
selector.register(self, selectors.EVENT_READ)
while not self.__shutdown_request:
ready = selector.select(poll_interval)
# bpo-35017: shutdown() called during select(), exit immediately.
if self.__shutdown_request