2011-02-07 3 views
0

Извините, если это не имеет смысла. Прошу прокомментировать, если требуется уточнение.Сохранение параллелизма в приложениях web.py по mod_wsgi

Я пишу небольшое приложение для загрузки файлов в web.py, которое я развертываю с помощью mod_wsgi + apache. У меня возникла проблема с управлением сеансами, и мне хотелось бы пояснить, как работает threading в web.py.

По существу я внедряю код в скрытое поле html-страницы, которую я визуализую, когда кто-то обращается к моей странице. Загрузка файла затем выполняется с помощью стандартного запроса POST, содержащего как файл, так и код. Затем я получаю прогресс файла, обновляя его в методе POST загрузки файлов и захватывая его с помощью запроса GET для другого класса. «Сессия» (извинения за это время довольно наивными) хранятся в объекте сеанса, как это:

class session: 

    def __init__(self): 

     self.progress = 0 
     self.title = "" 
     self.finished = False 

    def advance(self): 

     self.progress = self.progress + 1 

Сеансов все хранятся в глобальном словаре в моем приложении сценария, а затем получить доступ с моим кодом (от ранее) в качестве ключа.

По какой-то причине мой прогресс, кажется, остается равным 0 и никогда не увеличивается. Я отлаживал пару часов, и я обнаружил, что два объекта сеанса, на которые ссылаются класс загрузки и класс прогресса, не совпадают. Однако два кода (насколько я могу судить) равны. Это сводит меня с ума, поскольку он работал без проблем на тестовом сервере web.py на моей локальной машине.

EDIT: После некоторых исследований кажется, что словарь может быть скопирован для каждого запроса. Я попытался помещать словарь в другой и импортировать, но это не работает. Есть ли еще какой-то другой способ использовать базу данных для «разделения» словаря сеансов?

ответ

1

Apache/mod_wsgi может работать в многопроцессорных конфигурациях и, возможно, ваши запросы даже не обслуживаются одним и тем же процессом и никогда не будут, если для этой конфигурации многопроцессорности каждый процесс является единственным потоком, потому что, когда загрузка происходит, никакие другие запросы не могут быть обрабатывается тем же самым процессом. Читайте:

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

Возможно, вы должны использовать режим демона mod_wsgi с одним процессом многократного нити демона.

0

С PEP 333, определение WSGI:

серверов, которые могут работать несколько запросов параллельно, следует также предусмотреть возможность запуска приложения в однопоточных моде, так что приложения или структуры, которые не являются поточно -safe все еще может использоваться с этим сервером

Проверьте документацию на сервере WSGI.

Смежные вопросы