Jos*_*shi 0 python wsgi cherrypy uwsgi
前言:我想把这些问题分成小问题,但显然,我错过了一些难题,对我来说似乎不可能.
我使用cherrypy内置的WSGI服务器开发了我的樱桃应用程序.我天真地假设,到时候,我将能够使用创建的WSGI Application类并使用任何符合WSGI的服务器进行部署.
我使用这篇博文来创建我自己的(但非常相似)的cherrypy插件和工具,以便在http请求期间使用SQLAlchemy连接到数据库.
我希望任何服务器都能像Cherrypy的内置服务器一样工作:
此流程与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)
uWSGI使用工作进程,而不是线程.值得注意的是,这意味着全局变量不再在所有请求之间共享.您可以将SharedArea用于全局数据.默认情况下,这些进程是分叉的,因此请确保您已正确使用或调整设置(请参阅要了解的事项).
通过cherrypy.tree.mount(root, config=settings)
电话获取Cherrypy的WSGI应用程序.
如果您的数据库插件没有线程/共享数据问题,则可能会有效.就像你说的,你可能需要cherrypy.engine.start()
,但绝对不是cherrypy.engine.block()
,因为你的主要线程现在是uWSGI工作者.