Глобально доступный объект для всех работников Celery / кеша памяти в Django - PullRequest
8 голосов
/ 23 марта 2010

У меня довольно стандартная настройка Django + Rabbitmq + Celery с 1 заданием Celery и 5 рабочими.

Задача загружает тот же (я немного упрощаю) большой файл (~ 100 МБ) асинхронно на несколько удаленных ПК.

Все работает нормально за счет использования большого количества памяти, поскольку каждая задача / рабочий загружает этот большой файл в память отдельно.

То, что я хотел бы сделать, это иметь какой-то кэш, доступный для всех задач, то есть загрузить файл только один раз. Кеширование Django, основанное на locmem, было бы идеальным, но как в документации сказано: «у каждого процесса будет свой собственный экземпляр частного кэша», и мне нужен этот кэш, доступный для всех работников.

Пытался играть с сигналами сельдерея, как описано в # 2129820 , но это не то, что мне нужно.

Таким образом, вопрос заключается в следующем: есть ли способ определить что-то глобальное в Celery (например, класс, основанный на dict, где я мог бы загрузить файл или что-то в этом роде). Или я могу использовать трюк с Джанго в этой ситуации?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 26 ноября 2010

Почему бы просто не передавать потоковое видео с диска вместо загрузки всего файла в память?

1 голос
/ 23 марта 2010

Мне кажется, что вам нужен memcached для django. Таким образом, каждое задание в Celery будет иметь к нему доступ.

0 голосов
/ 27 октября 2010

Может быть, вы можете использовать потоки вместо процессов для этой конкретной задачи. Поскольку все потоки совместно используют одну и ту же память, вам нужна только одна копия данных в памяти, но вы все равно получаете параллельное выполнение. (это означает, что не использовать Celery для этой задачи)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...