【问题标题】:ctx parameter in multiprocessing.Queuemultiprocessing.Queue 中的 ctx 参数
【发布时间】:2014-07-24 18:29:18
【问题描述】:

我正在尝试使用 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.Queues 吗? 如果没有,我如何获得所需的 ctx 对象(它是什么?)

【问题讨论】:

  • 你用的是什么版本的 Python?
  • 你是如何导入Queue的?

标签: python python-3.x multiprocessing


【解决方案1】:

听起来您没有直接从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 哪个available methods for starting sub-processes 正在使用中。 multiprocessing.Queue 在内部使用 multiprocessing.Lock,它必须知道正确的上下文才能正常运行。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不应该是:“来自多处理导入队列”吗?
    猜你喜欢
    • 2019-10-14
    • 2018-12-12
    • 1970-01-01
    • 2021-01-24
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 1970-01-01
    相关资源
    最近更新 更多