python - 如何 fork 并执行服务器并等待它准备好?

标签 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. 在 fork 之前创建一个管道/队列。然后,就在您开始 io 循环之前,通知父级一切正常并且您已准备好接受请求。
  2. 打开端口并在 fork 之前绑定(bind)到它。您应该确保在父端关闭该套接字。但除此之外,唯一需要在子进程中运行的是 io 循环。您可以在 fork 之前处理所有其他错误。

关于python - 如何 fork 并执行服务器并等待它准备好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048560/

相关文章:

python - 将上下文管理器与协程一起使用

python - 是否有类似 Python 子进程的调用接受标准输入字符串并返回标准错误、标准输出和返回代码?

python - 在 Python 中通过 ssh 运行 popen 时,终端窗口不会保持打开状态

python - 使用 Paramiko 的标准输出作为子进程的标准输入

python - "WARNING:tornado.access:405"停止来自 "localhost"和 "file://"源的 POST 时出错

python - 如何使用模拟框架模拟 Tornado 协程函数进行单元测试?

python - 如何在 Linux 上并行化 Python 程序

php - 使用 PHP 创建实时网站

python - Bitnami-/opt/bitnami/python/bin/.python2.7.bin : error while loading shared libraries: libreadline. so.5

python - Jupyter导入错误: No module named