Глобальные объекты на сервере Python WSGI - PullRequest
5 голосов
/ 19 июля 2011

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

Но проблема в том, что веб-сервер python пытается импортировать себя для запуска потоков, и в этом процессе почти для каждого запроса создается новая очередь заданий, что нарушает логику. Есть ли способ, которым глобальная переменная может быть настроена на веб-серверах Python, поскольку Python Queue является поточно-ориентированным, я предполагаю, что это не принесет никакого вреда.

(пробовал два веб-сервера Flask и web.py)

1 Ответ

0 голосов
/ 19 июля 2011

Общие данные лучше всего хранить в базе данных.

Если вам нужна глобальная переменная для сеанса пользователя, то вы хотите сохранить их вместе с данными сеанса: вот подробности для web.py и для фляги .

Если у вас есть постоянный процесс, который обрабатывает очередь, вы можете посмотреть на запуск вашего сервера с FastCGI, где ваш сервер Python может работать в отдельном экземпляре.с вашего веб-сервера.Проверьте, как настроить FastCGI для web.py - посмотрите, возможно ли это подходит.Веб-сервер будет связываться с сервером Python через свой собственный порт, поэтому ваш сервер Python сможет продолжать работу и поддерживать любые глобальные данные.

[править]

Поскольку вам нужно совместно использовать переменные - выможет проверить flask.g для фляги или web.ctx для web.py.Я никогда не использовал их - поэтому я не знаю, есть ли злые последствия или проблемы с производительностью.Я видел пример здесь , который предложил в web.py сделать что-то вроде:

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()
...