multiprocessing.Queue中的ctx参数
我正在尝试使用来自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
,而这个锁需要知道正确的上下文才能正常工作。