2012-12-08 136 views
0

前言:我想將這些問題分成更小的問題,但顯然,我錯過了一些難題,對我來說似乎是不可能的。uWSGI,cherrypy和線程

我使用內置WSGI服務器的cherrypy開發了我的cherrypy應用程序。我天真地認爲,到時候,我將能夠使用創建的WSGI Application類並使用任何符合WSGI的服務器進行部署。

我使用this blog post來創建我自己的(但非常相似)cherrypy插件和工具,以便在http請求期間使用SQLAlchemy連接到數據庫。

我期望的任何服務器會以某種方式如內置在服務器CherryPy的工作:

  1. 主要過程將產生X線,以滿足X併發請求
  2. 我的引擎插件將創建SQLAlchemy的發動機,連接池= X (所以任何請求都將有它的連接)請求到達
  3. ,我的工具將提供從池

這種流動不SQL鍊金術連接與uWSGI相匹配(只要我明白了)。

我在uWSGI配置中指定我的application.py。這個文件看起來是這樣的:

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> 

回答

0

你應該張貼您的uWSGI的配置,否則會很難理解到底是怎麼回事。

順便說產卵額外的線程(每名工人),你只需添加--threadsň

+0

你好,謝謝你的回答。我編輯了問題並添加了我的uWSGI配置。 – JoshuaBoshi

+0

需要產生的線程數作爲參數 – roberto

6

uWSGI使用工作進程,而不是線程。值得注意的是,這意味着全局請求之間不再共享全局變量。您可以使用SharedArea獲取全局數據。 默認情況下,這些進程是分叉的,因此請確保您沒有問題或調整設置(請參閱Things to know)。

撥打cherrypy.tree.mount(root, config=settings)獲取Cherrypy的WSGI應用程序。

如果您的數據庫插件沒有線程/共享數據問題,它很可能會工作。就像你說的,你可能需要cherrypy.engine.start(),但絕對不是cherrypy.engine.block(),因爲你的主線程現在是uWSGI worker。

+0

本質上是的,我想補充一點,你可以運行1個worker和多個線程。 +1雖然你的答案給出了更多的線索比混淆:) –

+0

從技術上講,你可以,但由於GIL的表現會降低,這打破了目的。 – jwalker