Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中清除多处理队列_Python_Multiprocessing - Fatal编程技术网

如何在python中清除多处理队列

如何在python中清除多处理队列,python,multiprocessing,Python,Multiprocessing,我只是想知道如何像普通python队列一样清除python中的多处理队列。例如: from multiprocessing import Queue # multiprocessing queue from Queue import Queue # normal queue multi_q = Queue() normal_q = Queue() multi_q.clear() # or multi_q.queue.clear()

我只是想知道如何像普通python队列一样清除python中的多处理队列。例如:

from multiprocessing import Queue  # multiprocessing queue
from Queue import Queue            # normal queue

multi_q = Queue()
normal_q = Queue()
multi_q.clear()                    # or multi_q.queue.clear() 
“队列”对象没有“清除”属性

normal_q.queue.clear() # This is ok

无法直接清除
多处理.Queue


我相信最接近您的是
close()
,但这只是说明不再将数据推送到该队列,并在所有数据都被刷新到管道时将其关闭。

因此,我看一下队列类,您可以尝试以下代码:

while not some_queue.empty():
    some_queue.get()  # as docs say: Remove and return an item from the queue.

请求原谅而不是允许;只要尝试清空队列,直到获得
empty
异常,然后忽略该异常:

from Queue import Empty

def clear(q):
    try:
        while True:
            q.get_nowait()
    except Empty:
        pass
更好的是:内置类是否缺少所需的方法?对内置类进行子类化,并添加您认为应该存在的方法

from Queue import Queue, Empty

class ClearableQueue(Queue):

    def clear(self):
        try:
            while True:
                self.get_nowait()
        except Empty:
            pass
您的
ClearableQueue
类继承了内置
Queue
类的所有优点(和行为),并拥有您现在想要的方法


只要在您使用的所有地方使用
q=ClearableQueue()
,并在您愿意的时候调用
q.clear()

我是新手,所以不要对我生气,但是

为什么不重新定义.Queue()变量

import multiprocessing as mp

q = mp.Queue()
chunk = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

for i in chunk:
    q.put(i)
print(q.empty())

q = mp.Queue()
print(q.empty())
我的输出:

>>False
>>True

我现在只是在自我教育,所以如果我错了,请随时指出它

是的,在正常队列的情况下,您可以通过正常的队列清除其内容()。然而,我需要使用多处理一。谢谢你的回答这不是对你基本问题的回答,但我不得不指出,你问题中的
import
语句相互覆盖。如果使用上面编写的代码,则
multi_q
normal_q
都将是常规的
Queue.Queue
实例。要使其正常工作,您需要只导入模块并为类使用完全限定的名称(例如
multi_q=multiprocessing.Queue()
),或者使用
as
关键字以不同的名称导入它们(例如从Queue import Queue作为qQueue)。感谢您的回复,我尝试使用close()但问题是我有一个while循环:
而不是someQueue.empty():dosomething结束进程
,因此我想从其他进程中清除队列,从而while循环结束。但是,如果我关闭队列,它会引发一个错误
,而不是某个队列。empty():
更像是pythonic。应该选择这个答案,因为它实际上提供了一个解决方案,而不仅仅是说“没有直接的方法可以做到这一点”。这取决于您的实现,在调用
.empty()
时队列不为空,然后调用
.get()
时队列实际为空之间,可能存在竞争条件。如果是这种情况,由于
.get()
被阻塞,您的程序可能会挂起。改为使用
.get\u nowait()
来防止这种竞争情况。警告:如果在调用
非某个队列时,队列作为其中的最后一项,则此操作将被阻止。empty()
将在调用
某个队列.get()
之前删除该项。这在多线程环境中是完全可能的。我的
ClearableQueue
答案避免了这种情况。@PirateApp:yes,
get\u nowait()
可以避免这个问题。。。但是您必须捕获
空的
异常。。。在这一点上,您基本上已经实现了我的解决方案,如中所述——如果您可以
get\u nowait()
直到
empty
,为什么还要费心检查
get\u nowait()
?这段代码有一个bug,因为在Python中
get\u nowait
函数可以抛出
empty
,即使队列已满(是的,真的)@杰弗里欧文:我猜我会认为Python中有一个bug…不是我的示例代码!严肃地说:你提到的是有文档记录的功能吗?或者您只是指出了竞争条件,即当此方法返回时,可能有人在队列中推送了其他内容。在这种情况下。。。嗯,是的,那是可能发生的。多线程处理就是这样。但是,在我提议的
clear()
实现中,这仍然不是一个bug。我在实践中发现,我需要这种方法,而不是检查,因为多线程可以在
if
get
之间进行更改。根据文档(),“多处理使用通常的queue.Empty和queue.Full异常来表示超时。”,因此我认为假设异常
queue.Empty
意味着队列为空是错误的。@Stan:我真的不希望
get\u nowait()
将超时…根据定义,没有等待。以下是不起作用的原因:1)如果是多处理,则意味着一个(或多个)进程正在向队列添加内容,一个(或多个)进程进程正在从队列中删除内容。2)您的代码没有清除队列的第一个实例。相反,在执行代码的进程中,您只是停止了“注意”,创建一个新队列,并将其分配给同一个变量。3) 因此,任何具有指向第一个队列的指针的进程仍然将其视为非空。