2012-01-18 4 views
2

이와 비슷한 경우가있는 다른 사례를 찾는 데 문제가 있습니다.WSGI 환경에서 별도의 스레드 시작

나는 Werkzeug로 빌드 된 WSGI 응용 프로그램을 가지고 있으며 가능한 경우 WSGI 응용 프로그램과 동일한 컨텍스트에서 일부 백그라운드 정리 프로세스를 실행하고 싶습니다. (나는 cron에서 스크립트를 별도로 작성하지 않을 것입니다. 방법으로 응용 프로그램이 서비스로 시작될 때 필요한 배경 작업도 실행됩니다.) 사용중인 웹 서버는 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 

에서 하나 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

방법 요청과 끝의 끝에 정리 일을하는 프로세스의.

두 번째는 주기적으로 작업을 수행하고 프로세스 종료시 백그라운드 스레드를 올바르게 시도하고 닫는 백그라운드 스레드를 만드는 방법을 보여줍니다.