如何分叉和执行服务器并等待它准备好?

时间:2017-05-18 13:03:21

标签: python subprocess tornado

假设我有一个简单的Tornado网络服务器,它的启动方式如下:

app = ... # create an Application
srv = tornado.httpserver.HTTPServer(app)
srv.bind(port)
srv.start()
tornado.ioloop.IOLoop.instance().start()

我正在编写一个“端到端”测试,它使用subprocess.Popen在一个单独的进程中启动服务器,然后通过HTTP调用服务器。现在我需要确保服务器没有启动失败(例如因为端口忙)然后等到服务器准备就绪。

我写了一个函数来等待服务器准备好了:

def wait_till_ready(port, n=10, time_out=0.5):
    for i in range(n):
        try:
            requests.get("http://localhost:" + str(port))
            return
        except requests.exceptions.ConnectionError:
            time.sleep(time_out)

    raise Exception("failed to connect to the server") 

有更好的方法吗?

如果服务器端口繁忙,那么父进程如何分叉和执行服务器,确保服务器没有失败? (如果需要,我可以更改服务器代码。)

1 个答案:

答案 0 :(得分:1)

你可以通过两种方式接近它:

  1. 在fork之前创建一个管道/队列。然后,在您启动io循环之前,通知父母一切正常,您已准备好接受请求。
  2. 打开端口并在分叉前绑定到它。您应该确保在父端关闭该套接字。但除此之外,唯一需要在孩子身上运行的是io循环。您可以在fork之前处理所有其他错误。