运行 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
对象 不是 线程安全的,因此您需要对其加锁或为每个线程使用单独的对象。
我正在使用 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
对象 不是 线程安全的,因此您需要对其加锁或为每个线程使用单独的对象。