multiprocessing.Queue中的ctx参数

19 投票
2 回答
9099 浏览
提问于 2025-04-18 14:39

我正在尝试使用来自multiprocessing.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'

我在网上搜索这个问题时发现了这个链接:

http://bugs.python.org/issue21367

我怎么知道这个问题是否已经修复?现在使用multiprocessing.Queue就不可能了吗?如果不是,我该如何获取所需的ctx对象(这个对象是什么呢?)

2 个回答

7

这是从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())
21

听起来你没有直接从 multiprocessing 导入 Queue。当上下文被引入时,从 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 当前使用的是哪种 启动子进程的方法multiprocessing.Queue 内部使用了 multiprocessing.Lock,而这个锁需要知道正确的上下文才能正常工作。

撰写回答