Установить / получить объекты с memcached - PullRequest
0 голосов
/ 18 октября 2011

В приложении Django Python я запускаю задания с помощью Celery (диспетчера задач).Когда каждое задание запускается, они возвращают объект (давайте назовем его экземпляром класса X), который позволяет проверить задание и получить возвращаемое значение или выданные ошибки.

Несколько человек (надеюсь, когда-нибудь) смогут использовать этот веб-интерфейс одновременно;следовательно, несколько экземпляров класса X могут существовать одновременно, каждый из которых соответствует заданию, которое находится в очереди или выполняется параллельно.Трудно придумать способ удержать эти X объекты, потому что Я не могу использовать глобальную переменную (словарь, который позволяет мне искать каждый X объект по ключу) ;это связано с тем, что Celery использует разные процессы , а не просто разные потоки, поэтому каждый из них будет изменять свою собственную копию глобальной таблицы, вызывая хаос.

Впоследствии я получил отличный совет по использованию memcached для разделения памяти между задачами.Я получил его на работу и смог set и get целочисленные и строковые значения между процессами.

Беда в следующем: после большой отладки сегодня я узнал, что memcached 's set и get не работают на уроках.Это мое лучшее предположение: возможно, под капотом memcached сериализует объекты в общую память;Класс X (по понятным причинам) нельзя сериализовать, поскольку он указывает на текущие данные (состояние задания), и поэтому серийная версия может быть устаревшей (то есть она может указывать на неправильное место) при повторной загрузке.

Попытки использовать базу данных SQLite также оказались бесплодными;я не только не мог понять, как сериализовать объекты как поля базы данных (используя мой файл Django models.py), но я застрял бы с той же проблемой: дескрипторы запущенных заданий должны как-то оставаться в оперативной памяти (или использовать какую-то причудливую вещь).ОС трюки внизу), чтобы они обновлялись по мере завершения или сбоя задания.

Мое лучшее предположение заключается в том, что ( несмотря на совет, который, к счастью, дал мне это далеко ), я должен запускать каждую работув некоторой внешней очереди (например, Sun / Oracle Grid Engine).Тем не менее, я не мог придумать хороший способ сделать это без использования системного вызова, который, как я думал, может быть плохим стилем (и потенциально небезопасным).

Как вы отслеживаете работы, которые вы запускаете в Django или Django Celery?Запускаете ли вы их, просто помещая аргументы задания в базу данных, а затем выполняете другое задание, которое опрашивает базу данных и запускает задания?

Большое спасибо за вашу помощь, я совершенно растерялся.

1 Ответ

1 голос
/ 18 октября 2011

Я думаю, Джанго-сельдерей делает эту работу для вас.Вы смотрели на столы, сделанные Джанго-сельдереем?Т.е. djcelery_taskstate содержит все данные для данной задачи, такие как состояние , worker_id и так далее.Для периодических задач есть таблица с именем djcelery_periodictask.

. В представлении Django вы можете получить доступ к объекту TaskMeta:

from djcelery.models import TaskMeta
task = TaskMeta.objects.get(task_id=task_id)
print task.status
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...