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内部,必须知道正确的上下文才能正常运行.
这是应该从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)
| 归档时间: |
|
| 查看次数: |
3230 次 |
| 最近记录: |