Запуск отдельного потока в среде WSGI

Возникли проблемы с поиском других случаев, когда что-то подобное было реализовано.

У меня есть приложение WSGI, созданное с помощью Werkzeug, и я хотел бы запустить некоторые фоновые процессы очистки в том же контексте, что и приложение WSGI, если это возможно (я бы предпочел не иметь для них отдельных скриптов в cron, таким образом, когда приложение запускается как служба, необходимые фоновые задачи также выполняются.) Используемый веб-сервер - Apache с mod_wsgi.

Предположим, что это действительно простой пример WSGI, поскольку обслуживаемый контент на самом деле не является проблемой. Я собираюсь использовать тот, который есть у Pocoo на официальном Werkzeug документы:

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

Возможно ли запустить другой неблокирующий поток выполнения в функции create_app, который будет выполнять эти задачи в заданный интервал времени? 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

person DeaconDesperado    schedule 18.01.2012    source источник
comment
Почему приложение WSGI не может запустить его как демон и выключить при выходе?   -  person Ignacio Vazquez-Abrams    schedule 18.01.2012
comment
@ IgnacioVazquez-Abrams. Плохо, что я отвечаю на этот вопрос: демонизирующие вещи меня пугают? ;) Никогда не писал на Python скрипта, который был бы предназначен для использования таким образом. Вы знаете какие-нибудь хорошие учебники по этой теме? Спасибо!   -  person DeaconDesperado    schedule 18.01.2012


Ответы (1)


Читать:

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

и см. пример монитора кода в:

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

В первом есть общие примеры того, как убирать вещи в конце запроса и в конце процесса.

Второй показывает, как можно создать фоновый поток, чтобы делать что-то на периодической основе, и правильно попытаться закрыть фоновый поток при выходе из процесса.

person Graham Dumpleton    schedule 21.01.2012