0

序文: これらの問題を小さな問題に分けたいと思いますが、どうやら、パズルのいくつかのピースが欠けているようで、私には不可能に思えます。

私は、cherrypy の組み込み WSGI サーバーを使用して、cherrypy アプリケーションを開発しました。私は、その時が来れば、作成した WSGI Application クラスを使用して、WSGI 準拠のサーバーを使用してデプロイできるようになるだろうと単純に想定していました。

このブログ投稿を使用して、http 要求中に SQLAlchemy を使用してデータベースに接続するための独自の (ただし非常によく似た) cherrypy プラグインとツールを作成しました。

どのサーバーも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)

これを使用しapplication.pyて、アプリケーションを開発およびテストしていたときに、cherrypy の組み込みサーバーにアプリケーションをマウントしていました。

問題は、uWSGI 自体がスレッドを作成せず、作成されないため、SQLAlchemy プラグインが動作しないことcherrypy.engineです。

uWSGI はスレッドを使用して複数の同時リクエストを処理するという意味でスレッド化をサポートしていますか? でこれらのスレッドを開始できますapplication.pyか? uWSGI はそれを理解し、これらのスレッドを同時要求に使用しますか? そして、これはどのように行うことができますか?私はcherrypyが何とか使えると思いますか?cherrypy.engineまた、SQLAlchemy プラグインについてはどうですか? 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>
4

2 に答える 2

6

uWSGI は、スレッドではなくワーカー プロセスを使用します。これは、グローバルがすべてのリクエスト間で共有されなくなったことを意味することに注意してください。グローバル データにはSharedAreaを使用できます。プロセスはデフォルトでフォークされるため、問題がないことを確認するか、設定を調整してください (「知っておくべきこと」を参照してください)。

呼び出しで Cherrypy の WSGI アプリケーションを取得しcherrypy.tree.mount(root, config=settings)ます。

DB プラグインにスレッド化や共有データの問題がなければ、うまくいく可能性があります。あなたが言うように、あなたのメインスレッドは現在uWSGIワーカーであるため、必要かもしれcherrypy.engine.start()ませんが、絶対に必要ではありません。cherrypy.engine.block()

于 2012-12-18T21:36:21.657 に答える
0

uWSGI 構成を投稿する必要があります。そうしないと、何が起こっているのかを理解するのが難しくなります。

ちなみに、(ワーカーごとに) 追加のスレッドを生成するには、 --threads N を追加するだけです。

于 2012-12-09T07:15:12.283 に答える