Как создать потокобезопасный синглтон в python

Я хотел бы держать запущенные потоки в моем приложении Django. Поскольку я не могу сделать этого ни в модели, ни на сеансе, я подумал о том, чтобы держать их в одном элементе. Я проверял это некоторое время и действительно не нашел хорошего руководства для этого.

кто-нибудь знает, как создать потокобезопасный синглтон в Python?

EDIT:

более конкретно, что я хочу сделать, это реализовать какой-то "алгоритм в любое время", т. е. когда пользователь нажимает кнопку, возвращается ответ и начинается новое вычисление (новый поток). Я хочу, чтобы этот поток запускался до тех пор, пока пользователь снова не нажмет кнопку, а затем мое приложение вернет лучшее решение, которое ему удалось найти. для этого мне нужно где - то сохранить объект thread-я думал сохранить их в сеансе, что, по-видимому, я не могу сделать.

суть в том, что у меня есть вычисление FAT, которое я хочу сделать на стороне сервера, в разных потоках, в то время как пользователь использует мой сайт.

2 ответов


если у вас нет очень веской причины-вы должны выполнить длинные потоки в другом процессе и использовать сельдерей казнить их:

сельдерей-асинхронный с открытым исходным кодом очередь задач / очередь заданий на основе передача распределенного сообщения. Это сосредоточен на работе в реальном времени, но поддерживает планирование, а также.

единицы выполнения, называемые задачами, являются выполняемые одновременно на одном или нескольких использование рабочих узлов многопроцессорный, Eventlet или gevent. Задачи могут выполняться асинхронно (в фоновом режиме) или синхронно (дождаться готовности).

сельдерей руководство для djangonauts: http://django-celery.readthedocs.org/en/latest/getting-started/first-steps-with-django.html

на синглтоны и обмен данными между задачами / потоками, опять же, если у вас нет веской причины, вы должны использовать слой дБ (ака модели) с предостережение относительно блокировок БД и обновления устаревших данных.

обновление: что касается вашего случая использования, определяют Computation модель, с


Если вы хотите асинхронный код в веб-приложении, то вы принимаете неправильный подход. Вы должны запускать фоновые задачи с помощью очереди специальных задач, таких как сельдерей:http://celeryproject.org/

самая большая проблема у вас-это архитектура веб-сервера. Если вы не идете против рекомендуемой конфигурации веб-сервера Django и не используете MPM рабочего потока, у вас не будет возможности отслеживать дескрипторы потоков между запросами, поскольку каждый запрос обычно занимает свой собственный процесс. Вот как обычно работает Apache:http://httpd.apache.org/docs/2.0/mod/prefork.html

EDIT:

в свете вашего редактирования я думаю, что вы можете узнать больше, создав пользовательское решение, которое делает это:

  • поддерживает start / stop состояние в базе данных
  • создайте новую программу, которая работает как демон
  • периодически проверяйте состояние start / stop и начинайте или заканчивайте работу с вот!--14-->

нет необходимости в многопоточности, если вам нужно создать новый процесс для каждого пользователя. Если это так, все усложняется, и использование сельдерея сделает вашу жизнь намного проще.