Сохранение параллелизма в приложениях web.py на mod_wsgi - PullRequest
0 голосов
/ 08 февраля 2011

Извините, если это не имеет смысла. Пожалуйста, прокомментируйте, если требуется уточнение.

Я пишу небольшое приложение для загрузки файлов в web.py, которое развертываю с помощью mod_wsgi + apache. У меня возникла проблема с управлением сеансом, и я хотел бы получить разъяснения о том, как работает многопоточность в 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 на моей локальной машине.

РЕДАКТИРОВАТЬ: После некоторых исследований кажется, что словарь может быть скопирован для каждого запроса. Я пытался поместить словарь в другой и импортировать, но это не работает. Есть ли какой-то другой способ, кроме использования базы данных для «разделения» словаря сессий?

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

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

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

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

0 голосов
/ 08 февраля 2011

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

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

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

...