我正在尝试使用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对象(以及它是什么?)
答案 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())