需要刷新Python多处理队列

时间:2015-01-19 19:41:03

标签: python python-2.7 queue multiprocessing

以下是从Python文档部分16.6中的示例略微简化的代码,其中显示了如何从MP队列中放置和获取对象。

如果我的程序放入 - 例如 - mp队列中的大量对象,并且在Y从结果队列中取出后,应用程序逻辑决定它确实不需要处理其余的对象。

那么,如何删除/清除/清除/清除队列的内容?这里似乎也提出了同样的问题,答案是“但我无法相信没有办法做到这一点。

How to clear a multiprocessing queue in python

由于

import time, import random

from multiprocessing import Process, Queue, current_process

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

def calculate(func, args):
    result = func(*args)
    return current_process().name, func.__name__, args, result

def plus(a, b):
    time.sleep(5*random.random())
    return a, b, a + b

def test():
    NUMBER_OF_PROCESSES = 4
    TASKS2 = [(plus, (i, 8)) for i in range(10000)]

    # Create queues
    task_queue = Queue()
    done_queue = Queue()

    # Add more tasks using `put()`
    for task in TASKS2:
        task_queue.put(task)
        print task_queue.qsize()

    # Start worker processes
    for i in range(NUMBER_OF_PROCESSES):
        Process(target=worker, args=(task_queue, done_queue)).start()

    # Get and print results
    print 'Unordered results:'
    for i in range(len(TASKS1)+len(TASKS2)):
        s = done_queue.get()
        print s[0], s[3][2]

    # Tell child processes to stop
    for i in range(NUMBER_OF_PROCESSES):
        task_queue.put('STOP')

if __name__ == '__main__':
    test()

1 个答案:

答案 0 :(得分:0)

在您引用的问题How to clear a multiprocessing queue in python中,有一个答案可演示如何清除Queue。不是"接受"回答,但是大多数上票的人......

如果您的工作量很轻,这个问题就是重复的,引用的解决方案也适用于您的情况......因为queue.get()会清除Queue

如果您的工作需要一段时间(由于sleep),您可以更轻松地删除Queue,这意味着您需要重新构建代码空Queue可以替换要删除的现有Queue。为了保持指针的完整性,您可以将所有Queue个对象保留在列表queues中,然后只需用适当的索引替换Queue