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

问题描述 投票:0回答:2

我有一个django应用程序,我正在使用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中做这个。

django multithreading python-2.7 queue gunicorn
2个回答
0
投票

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


-2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.