В приложении 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?Запускаете ли вы их, просто помещая аргументы задания в базу данных, а затем выполняете другое задание, которое опрашивает базу данных и запускает задания?
Большое спасибо за вашу помощь, я совершенно растерялся.