【问题标题】:Can i programmatically start a WSGI application server without blocking the main thread of execution?我可以在不阻塞执行主线程的情况下以编程方式启动 WSGI 应用程序服务器吗?
【发布时间】:2012-08-13 18:53:54
【问题描述】:

我正在用 python 编写一个 Web 应用程序,并使用 lettucesplinter 为其编写验收测试。

为了做到这一点,我需要一个 wsgi 服务器在后台启动我的应用程序,以便该应用程序可用于我的测试套件。为此,我一直在另一个线程中启动一个女服务员服务器实例,以便驱动连接到的浏览器:

def setUp():
    base = os.path.dirname(__file__) + "/../../.."
    world.app = loadapp('config:test.ini', relative_to=base)
    world.server_thread = thread.start_new_thread(serve_app,  (world.app,))

def serve_app(app):
    serve(app, host='0.0.0.0', port=7654)

这很好用 - 我的测试套件可以使用正在运行的应用程序实例来设置固定装置/模拟等,并且我的测试可以连接到服务器。但是,当测试完成时,我无法向服务器发送信号以彻底关闭自身。因此,无论如何,我是否可以以某种方式将KeyboardInterrupt 发送到我生成的服务器线程(这将被女服务员捕获并提示它干净地关闭),或者如果失败,是否存在暴露的现有 wsgi 服务器实现我可以使用非阻塞 start()stop() 方法来代替女服务员吗?

【问题讨论】:

  • 你可能不应该直接使用thread(在Python 3中它被重命名为_thread)。您可以改用threading 模块。

标签: python testing wsgi


【解决方案1】:

将运行 WSGI 服务器的线程标记为守护线程。这样,当您退出主线程时,它不会等待服务器正在运行的线程完成,而只会退出应用程序。

【讨论】:

    【解决方案2】:

    您不一定需要 WSGI 服务器来对 WSGI 应用程序进行单元测试,example

    对于您的验收测试,您可以在单独的进程中启动服务器并在完成后发送 SIGINT。

    如果您想坚持当前的设置;您可以在主线程中运行服务器,在后台线程中运行测试。然后你可以send KeyboardInterrupt to the main thread from subthreads

    【讨论】:

    • 啊哈!两个很好的建议 - 我之前尝试过为服务器分叉一个进程,但我试图在线程之间共享应用程序实例(以便设置固定装置、模拟等并对其状态进行断言),并且因为 @ 987654323@ 具有写时复制语义,这是不可能的。不过,如果我能以某种方式负责从生菜的 setUp 块中生成服务器,并让其他一些进程为生菜测试生成一个子线程,然后初始化服务器,那么您的第二个建议可能会起作用。谢谢!
    【解决方案3】:

    问题只是进程不会关闭吗?

    我已经有一段时间没有使用 Python 进行 Web 开发了,所以我没有使用这些库的经验,但如果关闭是问题,那么使用守护线程似乎是一个不错的场景。

    这里提到: http://docs.python.org/library/threading.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多