Найти - Пользователи
Полная версия: Бесконечный цикл в Gunicorn процессе
Начало » Python для экспертов » Бесконечный цикл в Gunicorn процессе
1
Avi
Добрый день форумчане!
Помогите решить проблему. Не понимаю где кроется косяк.

Задача следующая:
Есть высоконагруженное приложение использующее Gunicorn в качестве веб-сервера. Мне нужно снимать данные с переменных которые меняются внутри выполняемых процессов. Данные не являются критически важными. Скорее являются статистическими для отладки и доработки приложения.
Параллельно у меня работает 129 процессов (сервер Quad на 64 ядра). Каждое обрабатывает параллельно десятки соединений.

Решение:
Я хотел обозначить в каждом процессе глобальную переменную в виде листа, куда бы складывал данные при выполнении тех или иных событий. Например: a +=1.
Далее нужно как-то эти данные сливать дальше для обработки. Я хотел перекладывать их в Memcache раз в секунду. Для этого в каждом процессе выполнил Greenlet.spawn(self.cycle) где cycle представляет собой бесконечный цикл:
    def cycle(self):
        while True:
            self.write_data()
            sleep(1)
В цикле write_data() перекладывает данные из локальный переменных в Memcache и зануляет их.

Проблема:
Цикл выполняется несколько раз и перестает выполняться. Когда приложение продолжает нормально функционировать.
Почему так происходит? Ведь процесс продолжает работать. Соответственно и цикл должен выполняться до тех пор пока существует процесс?

Спасибо.
Avi
Сам спросил, сам и отвечу.
Нельзя делать использовать общие переменные между потоками Gunicorn'а. Даже простейшие счетчики. Не говоря уже о классе, который сливает в Memcache отчет из потока.
Предполагаемый подход решение задачи был в корне не совместим с архитектурой написания многопоточного приложения на базе Gunicorn + Gevent.

https://groups.google.com/forum/#!topic/pylons-discuss/uTd5PIbRDps
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB