多处理中的ctx参数.Queue

use*_*165 8 python multiprocessing python-3.x

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

q = Queue()
Run Code Online (Sandbox Code Playgroud)

作为实例化的一个例子.如果我试试这个,我收到以下错误:

TypeError: __init__() missing 1 required keyword-only argument: 'ctx'
Run Code Online (Sandbox Code Playgroud)

谷歌搜索问题提出了这个问题:

http://bugs.python.org/issue21367

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

dan*_*ano 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())
Run Code Online (Sandbox Code Playgroud)

如果您要multiprocessing.queues.Queue直接导入并尝试实例化它,您将收到您所看到的错误.但是如果你multiprocessing直接导入它应该可以正常工作.

上下文对象告诉您正在使用multiprocessing哪些可用的启动子进程的方法.multiprocessing.Queue使用multiprocessing.Lock内部,必须知道正确的上下文才能正常运行.


Sam*_*uel 5

这是应该从Python 3.4以及后续版本继承多处理Queue类的方式:

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())
Run Code Online (Sandbox Code Playgroud)