Запуск отдельного потока в среде WSGI - PullRequest
2 голосов
/ 18 января 2012

Не удается найти другие случаи, когда что-то подобное было реализовано.

У меня есть приложение 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

1 Ответ

2 голосов
/ 21 января 2012

Прочитайте:

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

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

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

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

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

...