Python 我能否以编程方式启动WSGI应用程序服务器而不阻塞执行的主线程?

Python 我能否以编程方式启动WSGI应用程序服务器而不阻塞执行的主线程?,python,testing,wsgi,Python,Testing,Wsgi,我正在用python编写一个web应用程序,并使用with为其编写验收测试 为了做到这一点,我需要一个wsgi服务器在后台启动我的应用程序,以便该应用程序可用于我的测试套件。为此,我在另一个线程中启动了一个Waitess服务器实例,以便驱动浏览器连接到: def setUp(): base = os.path.dirname(__file__) + "/../../.." world.app = loadapp('config:test.ini', relative_to=bas

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

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

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)

这很好地工作了——我的测试套件可以使用正在运行的应用程序实例来设置fixture/mock等,服务器也可以连接到我的测试。但是,当测试完成时,我无法向服务器发送信号,要求它完全关闭。因此,我是否可以向我生成的服务器线程发送一个
KeyboardInterrupt
(该线程将被waitess捕获并提示它完全关闭),或者如果失败,是否存在一个现有的wsgi服务器实现,它公开了非阻塞
start()
stop()
我可以使用哪些方法来代替服务员?

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

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


如果你想坚持目前的设置;您可以在主线程中运行服务器,在后台线程中运行测试。然后你就可以了。

问题在于进程不会关闭吗

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

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

您可能不应该直接使用
线程
(在Python 3中,它被重命名为
\u thread
)。您可以使用
线程
模块代替。啊哈!这两个建议都很好——我以前曾尝试为服务器分叉一个进程,但我正在尝试在线程之间共享应用程序实例(以便设置fixture、mock等并对其状态进行断言),而且由于
fork()
具有写时复制语义,这是不可能的。不过,如果我能够以某种方式负责从莴苣的设置块中生成服务器,并让其他进程为莴苣测试生成子线程,然后初始化服务器,那么您的第二个建议可能会起作用。谢谢