2010-04-05 4 views
1

У меня есть простая страница django, на которой есть счетчик. Я использую Apache2 с mod_wsgi для его обслуживания.replay в django + apache + mod_wsgi?

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

Когда я обновляю его, он проходит между 0 и 1, явно используя некоторый кеш или так. Если я подожду некоторое время, а затем повторю попытку, он будет показывать 2 и 3, но будет зависеть от этих значений, пока этот кеш или что-то еще не будет сброшено, а затем счетчик продолжит.

Кто-нибудь знает, как я могу заставить его работать правильно (реальный сценарий связан с получением данных из БД, но проблемы с этим странным кешем совпадают).

BTW, у меня нет настроек кеширования в настройках django.

ответ

1

У вас запущено несколько экземпляров вашего Django. Apache случайно подключается к одному из них.

Для целей тестирования, попробуйте это в вашем apache.conf:

WSGIDaemonProcess mysite processes=1 maximum-requests=500 threads=1 

(Вы можете больше процессов в производственных целях.)

См full documentation вариантов.

+0

Спасибо! Этот простой ответ мне почему-то не вызвал. Знаете ли вы, как мне изменить количество этих экземпляров и каковы последствия сокращения числа экземпляров до 1? – Adam

+0

Количество экземпляров == процессы * потоки. Если работает только один экземпляр, один клиент может быть сразу подан, что делает ваше приложение медленным для пользователей, предполагая наличие нескольких одновременных пользователей. – jholster

3

Количество экземпляров! = Процессы * потоки, как предлагает другой плакат. Количество экземпляров == обрабатывается только.

Read:

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

Вероятно, вы работаете встроенный режим. Вместо этого вы должны использовать режим демона.

Не устанавливайте «процессы = 1», хотя по умолчанию это так и есть, и с помощью этого параметра есть другие побочные эффекты, которые могут вам не понадобиться.

По умолчанию количество потоков для режима демона равно 15, что отлично, если ваше приложение является потокобезопасным. В частности, доступ к вашему глобальному счетчику должен быть потокобезопасным.

Также читайте:

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

который имеет пример того, как настроить режим демона. Вам нужно использовать как директивы WSGIDaemonProcess, так и WSGIProcessGroup, а просто WSGIDaemonProcess недостаточно.

+0

Спасибо за информацию. Разве не так ли верно сказать, что количество одновременных обслуживаемых клиентов_ = процессы * потоков? – jholster

+0

Теоретический максимум количества одновременных запросов - это процессы * потоки, но все потоки в процессе обычно выполняются в одном экземпляре интерпретатора для конкретного приложения. Прочитайте 'http://blog.dscpl.com.au/2009/03/python-interpreter-is-not-created-for.html', я думаю, я немного об этом рассказываю. –