2015-10-13 111 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的之间的通信。 我的django项目包含一个名为“monitor”的应用程序,我的视图需要能够访问我在启动时创建的队列。

以前我通过启动我的线和在../monitor/urls.py创建我的队列然而,这是有问题的,因为它只会在第一次HTTP请求,该应用程序运行这样做。

任何人都知道要做到这一点的最好办法,还是应该我在一个完全不同的方式这样做。为了简单起见,我想避免使用诸如rabbitmq/redis之类的专用队列。

+2

请你正在试图做什么,不明确的(对我来说)你的WSGI文件如何有什么做你的看法为例更新您的问题 – Sayse

回答

1

Queue您使用这里是专为通信,当所有线程由一个主进程管理:

队列模块实现多生产,多消费队列。它 是特别有用的线程编程时,信息必须在多个线程之间安全地交换 。此 模块中的队列类实现了所有必需的锁定语义。它取决于 Python中线程支持的可用性;请参阅线程 模块。

这是不是当你在做web开发的情况。

您需要将您的队列处理与Web进程完全分开;你现在这样做的方式,我甚至无法想象它将来会造成多少问题。

你需要有三个独立的进程:一个启动您的队列

  1. 过程。
  2. 启动您的wsgi进程的过程,如果您处于开发模式,它可能与“runserver”类似;或uwsgi + supervisord +马戏团或类似的。
  3. 将完成发布在队列中的工作的工作人员。

不要将这些。

您的意见然后可以访问队列,而不用担心线程问题;而且你的工作人员也可以发布更新而不会有任何问

阅读来自celery这是越来越这一切在Django很容易做到的事实上的标准方式。