Django将对象传递给视图

时间:2015-10-13 13:33:31

标签: python django

在我的wsgi.py启动挂钩中,我创建了一个队列对象,我需要将它传递给views模块。

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

队列用于我的" euclid"线程和django。 我的django项目包含一个名为" monitor"我的视图需要能够访问我在启动时创建的队列。

之前我通过启动我的线程并在../monitor/urls.py中创建我的队列来做到这一点,但这是有问题的,因为它只会在对该应用程序的第一个http请求时运行。

任何人都知道最好的方法,或者我应该以完全不同的方式做到这一点。为简单起见,我想避免使用像rabbitmq / redis这样的专用队列。

1 个答案:

答案 0 :(得分:1)

您在此处使用的Queue是为所有线程由一个主进程管理时的通信而设计的:

  

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

当您进行Web开发时,情况并非如此。

您需要将队列流程与Web流程完全分开;你现在的方式我甚至无法想象它将来会引起多少问题。

您需要有三个独立的流程:

  1. 启动队列的流程。
  2. 启动wsgi进程的进程,如果您处于开发模式,可能类似于“runserver”;或者uwsgi + supervisord + circus或类似的。
  3. 将完成在队列中发布的工作的工作人员。
  4. 不要将这些结合起来。

    然后您的视图可以访问队列而不必担心线程问题;并且您的员工也可以毫无问题地发布更新。

    继续阅读celery,这是在django中轻松完成所有这些工作的事实标准方法。