继承multiprocessing.Queue时触发TypeError错误求助
继承multiprocessing.Queue时触发TypeError错误求助
嗨,我来帮你排查这个问题~
你遇到的TypeError: method expected 2 arguments, got 3错误,根源在于调用父类初始化方法时多传了一个self参数。
错误原因
你习惯了继承queue.Queue时的写法,但multiprocessing.Queue的构造逻辑和普通类不一样:当你通过super()调用父类的__init__方法时,Python会自动将当前类的实例(也就是self)传递给父类方法,你手动添加self就导致参数数量超出了预期——父类方法只需要2个参数,你却传了3个,所以触发了错误。
修复后的代码
只需要把super().__init__(self)改成不带self的调用即可:
import multiprocessing class DataMultiProcQueue(multiprocessing.Queue): def __init__(self): super().__init__() # 这里去掉多余的self参数 if __name__ == "__main__": my_queue = DataMultiProcQueue() my_queue.put(1) print(my_queue.get())
运行这段修改后的代码,就能正常输出1了。
额外建议:优先用组合而非继承
其实multiprocessing.Queue的内部实现是基于进程间通信的特殊机制,它本质上是一个工厂函数,直接继承它可能会遇到一些隐藏的问题(比如某些方法无法被正确重写、进程间同步异常等)。如果你的需求是扩展队列功能,更推荐用组合的方式:
import multiprocessing class DataMultiProcQueue: def __init__(self): self._queue = multiprocessing.Queue() def put(self, item): # 可以在这里添加自定义逻辑,比如日志、数据校验等 self._queue.put(item) def get(self): # 同样可以扩展get方法 return self._queue.get() # 如果你需要其他Queue的方法,也可以逐一封装 def qsize(self): return self._queue.qsize() if __name__ == "__main__": my_queue = DataMultiProcQueue() my_queue.put(1) print(my_queue.get())
这种方式更灵活,也能避免继承multiprocessing.Queue带来的潜在风险。
备注:内容来源于stack exchange,提问作者The Gum Machine
相关产品推荐
相关产品推荐

