Асинхронна обработка на опашка от задачи на структура от данни в паметта в 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 GB), така че предпочитам да не се налага да се занимавам с допълнителен слой Redis, memcached или друго... Няма ли начин да споделите обект в Python с Celery?   -  person cyberjoac    schedule 29.09.2014
comment
Но вие конкретно искате обработката да се извърши в отделен процес, което е смисълът на Celery; и процесите не споделят памет. Това не е ограничение на Python, а обща точка за процесите.   -  person Daniel Roseman    schedule 29.09.2014
comment
Също така имайте предвид, че ще имате абсолютно същите проблеми с междупроцесната комуникация, когато преминете от devserver към правилен производствен сървър, който почти сигурно ще използва множество процеси - всеки ще има свое собствено копие на сингълтона.   -  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