2011-07-19 7 views
4

私は、Webサーバーを使用してフロントエンドにサービスを提供するPythonでアプリケーションを作成しており、Web要求としてデータを受け入れた後、メインに共有されているジョブキューにタスクを転送しますスレッドを用いた処理機能。Python wsgiサーバーのグローバルオブジェクト

しかし、問題は、Python Webサーバーがスレッドを実行するために自分自身をインポートしようとしていることです。このプロセスではほとんどの要求ごとに新しいジョブキューが作成され、ロジックが破られます。 PythonのQueueはスレッドセーフなので、PythonのWebサーバーでグローバル変数を設定する方法はありますか?私はそれが何らかの害を及ぼすことはないと仮定しています。

(私は2台のWebサーバーフラスコとweb.pyを試してみました)

+0

あなたは、ファイルの変更上のスクリプトの自動リロードを無効にしたフラスコを使用する場合は?私はあなたの問題だと思う。 – Bastian

+0

はい、私は行いましたが、スクリプトは要求を処理するスレッドを作成するためにそれ自身をインポートしています。 – Pankaj

答えて

-2

共有データは、最高のデータベースに保存されています。

ユーザーのセッションごとにグローバル変数が必要な場合は、これらの値をセッションデータとともに保存する必要があります。ここにはdetails for web.pyfor flaskがあります。

キューを処理している永続プロセスがある場合は、サーバーをFastCGIで実行してみてください。ここでは、PythonサーバーをWebサーバーとは別のインスタンスで実行できます。 FastCGI for web.pyの設定方法をチェックしてください - おそらくそれが適切かどうかを確認してください。 Webサーバーは、独自のポートを介してPythonサーバーと通信するため、Pythonサーバーは実行を継続してグローバルデータを維持できます。

[編集]あなたは変数を共有する必要があるため

- あなたはweb.py.のためにフラスコのためflask.g、またはweb.ctxをチェックアウトする可能性があります私はそれらを使ったことはありません - 悪い意味合いやパフォーマンスの問題があるかどうかはわかりません。私のような何かをするweb.pyで提案an example hereを見た:

import web 

def add_global_hook(): 
    g = web.storage({"counter": 0}) 
    def _wrapper(handler): 
     web.ctx.globals = g 
     return handler() 
    return _wrapper 

class Hello: 
    def GET(self): 
     web.ctx.globals.counter += 1 
     return "<h1>Counter: %d</h1>" % web.ctx.globals.counter 

if __name__ == '__main__': 
    urls = ("/", "Hello") 
    app = web.application(urls, globals()) 
    app.add_processor(add_global_hook()) 
    app.run() 
+1

私はPythonオブジェクトを共有したいので、データベースは除外されます – Pankaj

+0

私はグローバルで見た情報をいくつか追加しましたが、私はこれを使ったことは一度もありませんでした。 –

関連する問題