2015-10-13 6 views
-1

В моих стартовых крючках wsgi.py я создаю объекты очереди, которые мне нужно передать в модуль views.Django, передающий объекты в представлениях

# Create and start thread for euclid. 
q = queue.Queue() 
euclidThread = threading.Thread(target=startEuclidServer, 
    kwargs={"msgq":q}) 
euclidThread.setDaemon(True) 
euclidThread.start() 

Очередь используется для связи между моей «евклидовой» нитью и джанго. В моем проекте django есть приложение под названием «monitor», где мои представления должны иметь доступ к очереди, которую я создаю при запуске.

Раньше я делал это, открывая свой поток и создавая свою очередь в ../monitor/urls.py, однако это было проблематично, поскольку оно могло работать только при первом HTTP-запросе к этому приложению.

Кто-нибудь знает лучший способ сделать это, или я должен делать это совершенно по-другому. Для простоты я хочу избежать использования выделенной очереди, такой как rabbitmq/redis.

+2

Пожалуйста, обновите свой вопрос примером того, что вы пытаетесь сделать, его непонятным (для меня), как ваш файл wsgi имеет какое-либо отношение к вашим представлениям – Sayse

ответ

1

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

Модуль Queue реализует мульти-производитель, мульти-потребителей очередей. Он особенно полезен при программировании с резьбой, когда информация должна быть безопасно обмениваться между несколькими потоками. Класс Queue в этом модуле реализует все необходимые семантики блокировки. Это зависит от доступности поддержки потоков в Python; см. модуль резьбы .

Это не тот случай, когда вы занимаетесь веб-разработкой.

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

Вы должны иметь три отдельных процесса:

  1. процесс, который запускает вашу очередь.
  2. Процесс, который запускает ваш процесс (ы) wsgi, который может быть чем-то вроде «сервера запуска», если вы находитесь в режиме разработки; или uwsgi + supervisord + цирк или аналогичный.
  3. Работник (работники), который выполнит работу, размещенную в очереди.

Не используйте их.

Ваши взгляды могут получить доступ к очереди, не беспокоясь о проблемах с потоком; и ваши работники также могут публиковать обновления без каких-либо проблем.

Прочтите на celery, который является стандартным способом дезактивации получения всего этого в django.

Смежные вопросы