前言:我想把这些问题分成更小的问题,但显然,我错过了一些拼图,在我看来是不可能的。
我使用cherrypy构建在WSGI服务器中的cherrypy应用程序开发了cherrypy应用程序。我天真地认为,当时机成熟时,我将能够使用创建的WSGI应用程序类,并使用任何符合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)在开发和测试应用程序时,我使用这个application.py将我的应用程序安装到cherrypy的内置服务器中。
问题是uWSGI本身没有创建任何线程,我的SQLAlchemy插件也没有使用它,因为没有创建cherrypy.engine。
uWSGI是否支持线程处理,即使用线程来服务多个并发请求?我可以在我的application.py中启动这些线程吗?uWSGI会理解它并将这些线程用于并发请求吗?如何才能做到这一点?我觉得樱桃可以用,还是不可以?那么我的SQLAlchemy插件呢,当我只使用WSGI cherrypy.Application时,如何启动cherrypy.engine呢?
任何能帮助我的帮助或信息都将不胜感激。
编辑:
我的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>发布于 2012-12-18 21:36:21
uWSGI使用的是工作进程,而不是线程。值得注意的是,这意味着不再在所有请求之间共享全局。您可以将SharedArea用于全局数据。默认情况下,进程是分叉的,所以请确保您对此没有问题,或者调整设置(请参阅要知道的事)。
使用cherrypy.tree.mount(root, config=settings)调用获取Cherrypy的WSGI应用程序。
如果您的DB插件没有线程/共享数据问题,它很可能会工作。正如您所说的,您可能需要cherrypy.engine.start(),但绝对不需要cherrypy.engine.block(),因为您的主线程现在是uWSGI工作线程。
发布于 2012-12-09 07:15:12
您应该发布您的uWSGI配置,否则将很难理解发生了什么。
顺便说一句,要生成额外的线程(每个工作人员),您只需添加-线程N。
https://stackoverflow.com/questions/13781185
复制相似问题