Асинхронная обработка очереди задач структуры данных в памяти в Django

У меня есть одноэлементная структура данных в памяти внутри моего проекта Django (какое-то kd-дерево, к которому нужно получить доступ по всему проекту).

Для тех, кто не знает Django, я полагаю, что та же проблема возникнет с обычным кодом Python.

Я знаю, что это зло (Singleton), и я ищу лучшие способы реализовать это, но мой вопрос здесь связан с другой темой:

Я создаю экземпляр синглтона внутри своего кода, вызывая Singleton.instance(), и он правильно дает мне объект, затем он остается в каком-то месте в памяти внутри моего ./manage.py runserver.

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

НО при запуске Celery worker он запускает код внутри другого процесса и, следовательно, имеет другое пространство памяти, что означает, что он работает на совершенно другом экземпляре Singleton.

Что было бы лучшим шаблоном проектирования для этой проблемы? Я думал о том, чтобы выполнить всю обработку, связанную с моей структурой данных, внутри проекта Django (без использования Celery), но что мне очень понравилось в Celery, так это то, что обработка, необходимая для структуры данных, может занять много времени (около 30 секунд) и он должен хорошо обрабатывать параллелизм (может быть несколько запросов одновременно для восстановления Kd-Tree).

Я был бы очень рад получить некоторое представление об этом, так как за последние 3 дня я не добился никакого прогресса. Большое спасибо.


person cyberjoac    schedule 28.09.2014    source источник
comment
Ваш вопрос звучит как классическая проблема межпроцессного взаимодействия, а не с участием синглтона. Правильный ответ будет во многом зависеть от того, как вы получите состояние в своей задаче с сельдереем. По умолчанию вы можете попробовать передать по параметру или использовать кеш или механизм хранения для обмена состоянием между двумя процессами. Возможно, если бы вы могли предоставить больше информации о состояниях, которыми вы хотите поделиться, и о том, как вам это нужно, можно было бы дать лучшие предложения.   -  person RobertoAllende    schedule 29.09.2014
comment
Структура данных очень большая (может достигать 2 ГБ), так что мне бы не пришлось иметь дело с дополнительным слоем Redis, memcached или чем-то еще... Нет ли способа поделиться объектом в Python с Celery?   -  person cyberjoac    schedule 29.09.2014
comment
Но вы специально хотели, чтобы обработка выполнялась в отдельном процессе, что и является точкой зрения Celery; и процессы не разделяют память. Это не ограничение Python, а общее замечание о процессах.   -  person Daniel Roseman    schedule 29.09.2014
comment
Также обратите внимание, что у вас будут точно такие же проблемы взаимодействия между процессами при переходе с сервера разработки на правильный рабочий сервер, который почти наверняка будет использовать несколько процессов — каждый будет иметь свою собственную копию синглтона.   -  person Daniel Roseman    schedule 29.09.2014
comment
Теперь я получаю ограничения на выполнение этого в другом процессе. Что мне лучше всего сделать, чтобы решить эту проблему? Как лучше всего разделить состояние? Должен ли я изучать IPC (например, многопоточную библиотеку Python) или больше в таких вещах, как Redis, Memcached и т. д.? Проблема, которую я вижу с этими параметрами, заключается в том, что мне нужно будет сериализовать/десериализовать структуру данных внутри памяти при каждом запросе. Кроме того, Даниэль, как можно было бы решить эти проблемы с IPC на рабочем сервере? Большое спасибо   -  person cyberjoac    schedule 29.09.2014
comment
Вы решили проблему?? я тоже в такой же ситуации   -  person Parikshit Chalke    schedule 22.08.2019