uWSGI,cherrypy和threading

Jos*_*shi 0 python wsgi cherrypy uwsgi

前言:我想把这些问题分成小问题,但显然,我错过了一些难题,对我来说似乎不可能.

我使用cherrypy内置的WSGI服务器开发了我的樱桃应用程序.我天真地假设,到时候,我将能够使用创建的WSGI Application类并使用任何符合WSGI的服务器进行部署.

我使用这篇博文来创建我自己的(但非常相似)的cherrypy插件和工具,以便在http请求期间使用SQLAlchemy连接到数据库.

我希望任何服务器都能像Cherrypy的内置服务器一样工作:

  1. 主进程将产生X线程以满足X并发请求
  2. 我的引擎插件将使用连接池= X创建SQLalchemy引擎(因此任何请求都将具有其连接)
  3. 在请求到达时,我的工具将从池提供sql炼金术连接

此流程与uWSGI不匹配(只要我理解).

application.py在uWSGI配置中分配了我的.这个文件看起来像这样:

cherrypy.tools.db = DbConnectorTool()
cherrypy.engine.dbengine = DbEnginePlugin(cherrypy.engine, settings.database)
cherrypy.config.update({
    'engine.dbengine.on': True
})

from myapp.application import Application
root = Application(settings)
application = cherrypy.Application(root, script_name='', config=settings)
Run Code Online (Sandbox Code Playgroud)

我用这个application.py安装我的申请,建于当我开发和测试其服务器CherryPy的.

问题是uWSGI本身并没有创建任何线程,而且我的SQLAlchemy插件没有使用它,因为没有cherrypy.engine创建.

uWSGI是否支持使用线程为多个并发请求提供服务的线程?我能在我的网站上启动这些线程application.py吗?uWSGI会理解它并将这些线程用于并发请求吗?怎么能这样呢?我认为cherrypy可以以某种方式使用,或不?那我的SQLAlchemy插件怎么样,我cherrypy.engine只能在仅使用WSGI时启动cherrypy.Application

任何可以帮助我的帮助或信息将不胜感激.

编辑:

我的uWSGI配置:

<uwsgi>
    <socket>127.0.0.1:9001</socket>
    <master/>
    <daemonize>/var/log/uwsgi/app.log</daemonize>
    <logdate/>
    <threads/>
    <pidfile>/home/web/uwsgi.pid</pidfile>
    <uid>uwsgi</uid>
    <gid>uwsgi</gid>
    <workers>2</workers>
    <harakiri>90</harakiri>
    <harakiri-verbose/>
    <home>/home/web/</home>
    <pythonpath>/home/web/instance</pythonpath>
    <module>core.application</module>
    <no-orphans/>
    <touch-reload>/home/web/uwsgi-reload-web</touch-reload>
</uwsgi>
Run Code Online (Sandbox Code Playgroud)

jwa*_*ker 6

uWSGI使用工作进程,而不是线程.值得注意的是,这意味着全局变量不再在所有请求之间共享.您可以将SharedArea用于全局数据.默认情况下,这些进程是分叉的,因此请确保您已正确使用或调整设置(请参阅要了解的事项).

通过cherrypy.tree.mount(root, config=settings)电话获取Cherrypy的WSGI应用程序.

如果您的数据库插件没有线程/共享数据问题,则可能会有效.就像你说的,你可能需要cherrypy.engine.start(),但绝对不是cherrypy.engine.block(),因为你的主要线程现在是uWSGI工作者.