我可以以编程方式启动WSGI应用程序服务器而不阻塞主要执行线程吗?

时间:2012-08-13 18:53:54

标签: python testing wsgi

我正在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()方法,而不是女服务员?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

问题只是该过程不会关闭吗?

自从我使用Python进行Web开发已经有一段时间了,所以我没有这些库的经验,但如果关闭是问题,那么使用守护程序线程看起来是个好方案。

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

答案 2 :(得分:1)

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