You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

继承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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:04:34