运行 Tornado WSGIAdapter 应用程序的标称 mod_wsgi WSGIDaemonProcess 配置是什么?

What is the nominal mod_wsgi WSGIDaemonProcess configuration for running Tornado WSGIAdapter apps?

我正在使用 Tornado Web 框架,但我的部署环境之一是 mod_wsgi 在 prefork Apache 2 上(奇怪的托管要求)。

processes=n threads=1 是为 tornado.wsgi.WSGIAdapter 设置我的 WSGIDaemonProcess 的正确方法吗?我自己的代码应该是线程安全的,但是,我将 SQLAlchemy Session() 绑定到处理程序 .prepare()tornado.web.RequestHandler 的实例,作为 here (我显然没有在 WSGI 中使用协同程序-模式)。我也在一些请求处理程序中使用阻塞 tornado.httpclient.HTTPClient

此外,WSGIDaemonProcess 处理 fork() 是否与 tornado.httpserver.HTTPServer().start(n) 相当?

(我在这里发布这个问题是因为我不知道如何同时询问@Ben Darnell 和@Graham Dumpleton 而不会向 tornado 和 mod_wsgi 列表发送垃圾邮件)。

WSGIAdapter 线程安全的,使用它的Tornado子集也是如此(例如,RequestHandler.write是线程安全的与 WSGIAdapter 一起使用时,但与 IOLoop 一起使用时不使用)。因此,当 运行 WSGIAdapter 时,您可以按照与任何其他 WSGI 框架相同的方式配置您的 WSGI 服务器(通常类似于每个 CPU 核心 1 个进程(这与您使用 HTTPServer.start(n)) 和每个进程 5-10 个线程,具体取决于您在 I/O) 中花费的时间。

请注意 tornado.httpclient.HTTPClient 对象 不是 线程安全的,因此您需要对其加锁或为每个线程使用单独的对象。