Форум сайта python.su
Добрый день форумчане!
Помогите решить проблему. Не понимаю где кроется косяк.
Задача следующая:
Есть высоконагруженное приложение использующее Gunicorn в качестве веб-сервера. Мне нужно снимать данные с переменных которые меняются внутри выполняемых процессов. Данные не являются критически важными. Скорее являются статистическими для отладки и доработки приложения.
Параллельно у меня работает 129 процессов (сервер Quad на 64 ядра). Каждое обрабатывает параллельно десятки соединений.
Решение:
Я хотел обозначить в каждом процессе глобальную переменную в виде листа, куда бы складывал данные при выполнении тех или иных событий. Например: a +=1.
Далее нужно как-то эти данные сливать дальше для обработки. Я хотел перекладывать их в Memcache раз в секунду. Для этого в каждом процессе выполнил Greenlet.spawn(self.cycle) где cycle представляет собой бесконечный цикл:
def cycle(self): while True: self.write_data() sleep(1)
Офлайн
Сам спросил, сам и отвечу.
Нельзя делать использовать общие переменные между потоками Gunicorn'а. Даже простейшие счетчики. Не говоря уже о классе, который сливает в Memcache отчет из потока.
Предполагаемый подход решение задачи был в корне не совместим с архитектурой написания многопоточного приложения на базе Gunicorn + Gevent.
https://groups.google.com/forum/#!topic/pylons-discuss/uTd5PIbRDps
Офлайн