2012-01-18 16 views
2

このようなものが実装されている他のケースを見つけるのに問題があります。WSGI環境で別のスレッドを開始する

私はWerkzeugで構築されたWSGIアプリケーションを持っています。可能であれば、WSGIアプリケーションと同じコンテキストでいくつかのバックグラウンドクリーンアッププロセスを実行したいと思います(私は、アプリケーションとしてサービスが開始されると、必要なバックグラウンドタスクも実行されます)。使用されているWebサーバーはmod_wsgiのApacheです。

提供されているコンテンツが実際に問題にならないため、実際には基本的なWSGIの例を想定してみましょう。私は先に行くと、時限間隔でこれらのタスクを実行することになりcreate_app関数内の実行の他、非ブロッキングスレッドを開始することが可能だろうofficial Werkzeug docs:

class Shortly(object): 

    def __init__(self, config): 
     self.redis = redis.Redis(config['redis_host'], config['redis_port']) 

    def dispatch_request(self, request): 
     return Response('Hello World!') 

    def wsgi_app(self, environ, start_response): 
     request = Request(environ) 
     response = self.dispatch_request(request) 
     return response(environ, start_response) 

    def __call__(self, environ, start_response): 
     return self.wsgi_app(environ, start_response) 


def create_app(redis_host='localhost', redis_port=6379): 
    app = Shortly({ 
     'redis_host':  redis_host, 
     'redis_port':  redis_port 
    }) 
    return app 

で1 Pocooを持って使用するつもりですか? mod_wsgiは、これが必要とするように '継続的に'アプリケーションを実行しますか?

def create_app(redis_host='localhost', redis_port=6379): 
    app = Shortly({ 
     'redis_host':  redis_host, 
     'redis_port':  redis_port 
    }) 

    #do some other stuff in a separate thread while the webapp is running 
    task = threading.Thread(target=DBCleanup, args=(query, stuff)) 
    task.start() 
    return app 
+0

WSGIアプリケーションでデーモンとして起動できないため、終了時にシャットダウンできません。 –

+0

@ IgnacioVazquez-Abramsそれについての私の答えは、大変なことが私を怖がらせるということは悪いですか? ;)このような方法で使用することを意図したスクリプトをPythonで書いたことはありません。あなたはそのテーマの良いプライマーについて知っていますか?ありがとう! – DeaconDesperado

答えて

2

読む:

http://code.google.com/p/modwsgi/wiki/RegisteringCleanupCode

とのコードモニターの例を参照してください:最初のリクエストと終わりの終わりにどのようにクリーンアップ物事への一般的な例があり

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes

プロセスの

バックグラウンドスレッドを作成して期間ベースで処理し、プロセス終了時にバックグラウンドスレッドを適切に試して終了する方法を示します。

関連する問題