我有一个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中做这个。
答案 0 :(得分:0)
所以似乎gunicorn分叉并创建了多个工作进程,而不像Django的webserver只创建线程。因为所有上述问题都是在gunicorn forks之前完成的,所以gunicorn fork复制了地址空间而不是线程。因此,队列将存在于同一个虚拟地址,并且将存在于gunicorn创建的每个进程中,并且数据将被放入新创建的工作进程中的每个队列中。但是,消耗或Queue.get()仅在没有Queue.put发生的初始进程中发生。
我使用multiprocessing.Queue来修复它。它就像一个魅力。
答案 1 :(得分:-2)
创建一个队列,并在其中插入5个整数。然后写一个方法EvenNumber 打印存储在队列中的偶数数据。在主类中测试您的方法。