Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/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多处理队列可靠性,队列vs SimpleQueue vs JoinableQueue_Python_Process_Multiprocessing - Fatal编程技术网

Python多处理队列可靠性,队列vs SimpleQueue vs JoinableQueue

Python多处理队列可靠性,队列vs SimpleQueue vs JoinableQueue,python,process,multiprocessing,Python,Process,Multiprocessing,直接从Python开始: 类多处理。队列([maxsize]) qsize() 返回队列的大致大小。由于多线程/多处理语义,此数字不可靠 空的() 如果队列为空,则返回True,否则返回False。由于多线程/多处理语义,这是不可靠的 根据经验,我发现这对于队列,尤其是empty() 在我的代码中,我有一组进程(每个进程都是同一主进程的子进程),每个进程的run方法中都有以下内容: while self.active: if(self.exclusive_queue.empty() a

直接从Python开始:

类多处理。队列([maxsize])

qsize() 返回队列的大致大小。由于多线程/多处理语义,此数字不可靠

空的() 如果队列为空,则返回True,否则返回False。由于多线程/多处理语义,这是不可靠的

根据经验,我发现这对于
队列
,尤其是
empty()

在我的代码中,我有一组进程(每个进程都是同一主进程的子进程),每个进程的
run
方法中都有以下内容:

while self.active:
    if(self.exclusive_queue.empty() and self.exclusive_queue.qsize() == 0):
        try:
            self.exclusive_queue.put(self.general_queue.get(timeout=self.queue_timeout))
        except Queue.Empty as empty_queue:
            continue
    else:
        task = self.exclusive_queue.get()
        self.compute(task)
基本上,进程在
常规队列
上等待工作,但首先检查其
独占队列
。主进程可以将任务放入进程的常规队列或独占队列中。现在,在
if(self.exclusive\u queue.empty()和self.exclusive\u queue.qsize()==0)
中,我首先使用了
self.exclusive\u queue.empty()
,这导致了相当奇怪的行为(
qsize()
为30+和
empty()=True

因此,我要说的是-对于文档中的
多处理.queues.SimpleQueue

空的() 如果队列为空,则返回True,否则返回False

根本没有提到可靠性。SimpleQueue.empty()可靠吗

第二种是
多处理。JoinableQueue
可靠还是比
Queue
更可靠,因为
task_done()
机制


这样的方法可以被认为是正确的吗?或者使用回调(通过子级之间的共享管道端点)的方法更合适吗?

这不是一个直接的答案,但我已经开始越来越依赖于使用保护条件迭代输入队列。多处理模块的文档中有一个示例:

def worker(input, output):
    for func, args in iter(input.get, 'STOP'):
        result = calculate(func, args)
        output.put(result)

因此,当您对队列的输入完成后,您只需将
尽可能多的
STOP
字符串,或您选择的任何保护,放入队列,就像您启动进程一样。

是的,我在服务器中使用的方法基本相同。如果
compute
得到一个
None
值,它将
active
变为
False
。然而,正如你在我的例子中所看到的,我有两个队列要等待——“独占”和“通用”队列,其思想是“如果独占为空,则从通用获取”,因为我希望即使在常规队列中有条目也能停止进程,所以我将
None
s放在排他队列中。在我的情况下
SimpleQueue
只能存储太少的元素[roughly 360
(int,str,int)-元组)
]。出于这个原因,我决定对队列使用
STOP
元素(如
middnighter
s答案中所述)。对于队列,即使在相同结构的100000个元素之后,我也没有达到大小限制。