即使其中有项目,队列也是空的

时间:2017-07-11 18:12:22

标签: django multithreading python-2.7 queue gunicorn

我有一个django app我正在使用Queue。

class DataThread (threading.Thread):
    data_queue = Queue.Queue()

在另一个线程中,我将一些内容添加到队列中,如下所示

DataThread.data_queue.put(msg)

它以 DataThread 以下面的方式消费

while True:
    self.sendMessagesFromQueue()
    time.sleep(1)
def sendMessagesFromQueue(self):
    try:
        while not DataThread.data_queue.empty():
            data = self.data_queue.get()
            #Some processing logic
    except Exception as e:
        print str(e)

现在,当我使用python manage.py runserver(使用django本身)运行它时,此功能正常。 但是当我使用 gunicorn 来运行此应用程序时它不起作用。因为队列空检查一直返回空,但是当我在队列中检查队列大小时,它会不断增加。

编辑:我甚至检查过队列是否相同。它们具有相同的内存位置。此外,我不确定这是否有帮助,但这些线程是在gunicorn启动之前创建的。我是在sitecustomize中做这个。

2 个答案:

答案 0 :(得分:0)

所以似乎gunicorn分叉并创建了多个工作进程,而不像Django的webserver只创建线程。因为所有上述问题都是在gunicorn forks之前完成的,所以gunicorn fork复制了地址空间而不是线程。因此,队列将存在于同一个虚拟地址,并且将存在于gunicorn创建的每个进程中,并且数据将被放入新创建的工作进程中的每个队列中。但是,消耗或Queue.get()仅在没有Queue.put发生的初始进程中发生。
我使用multiprocessing.Queue来修复它。它就像一个魅力。

答案 1 :(得分:-2)

创建一个队列,并在其中插入5个整数。然后写一个方法EvenNumber 打印存储在队列中的偶数数据。在主类中测试您的方法。