【问题标题】:Queue is empty even though there are items in it队列是空的,即使里面有项目
【发布时间】:2017-07-11 18:12:22
【问题描述】:

我有一个使用 Queue 的 django 应用程序。

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 开始之前创建的。我正在站点自定义中进行此操作。

【问题讨论】:

    标签: django multithreading python-2.7 queue gunicorn


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这如何回答原来的问题?
      • 为什么我只是失去了代表?通知指向这个答案.. @Jojo A 是否因为他不相关的答案而对我的问题/答案投了反对票?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      相关资源
      最近更新 更多