多处理中的ctx参数.Queue

时间:2014-07-24 18:29:19

标签: python python-3.x multiprocessing

我正在尝试使用multiprocessing.Queue模块中的Queue。 实施(https://docs.python.org/3.4/library/multiprocessing.html#exchanging-objects-between-processes)使用

q = Queue()

作为实例化的示例。如果我试试这个,我会收到以下错误:

TypeError: __init__() missing 1 required keyword-only argument: 'ctx'

用Google搜索问题:

http://bugs.python.org/issue21367

我如何知道这是否已修复?是不是可以使用多处理。现在的问题? 如果没有,我如何获得所需的ctx对象(以及它是什么?)

2 个答案:

答案 0 :(得分:10)

听起来您并非直接从Queue导入multiprocessing。引入上下文时,从multiprocessing顶级包导入的大多数对象都成为内部获取上下文的函数,然后将其传递给基础类初始化程序,而不是本身的类。例如,以下是multiprocessing.Queue现在的内容:

def Queue(self, maxsize=0):
    '''Returns a queue object'''
    from .queues import Queue
    return Queue(maxsize, ctx=self.get_context())

如果您要直接导入multiprocessing.queues.Queue并尝试对其进行实例化,那么您将收到您所看到的错误。但如果直接从multiprocessing导入它,它应该可以正常工作。

上下文对象告诉multiprocessing正在使用available methods for starting sub-processes中的哪一个。 multiprocessing.Queue在内部使用multiprocessing.Lock,必须知道正确的上下文才能正常运行。

答案 1 :(得分:4)

这是多处理队列类应该如何从Python 3.4继承而来:

from multiprocessing.queues import Queue

class BlockedQueue(Queue):
    def __init__(self, maxsize=-1, block=True, timeout=None):
        self.block = block
        self.timeout = timeout
        super().__init__(maxsize, ctx=multiprocessing.get_context())