当前位置: 首页 > 知识库问答 >
问题:

TypeError:init()缺少1个必需的位置参数:“message”正在使用多处理

芮朗
2023-03-14

我正在使用多处理池运行一段代码。代码在一个数据集上工作,在另一个数据集上失败。很明显,问题是数据驱动的——我不清楚从哪里开始故障排除,因为我收到的错误如下。任何关于起点的提示都会非常有用。这两组数据都是使用相同的代码准备的——所以我不认为会有什么不同——但我在这里。

另请参见Robert的评论-我们在操作系统、python版本3.6(我有3.4,他有3.6)和完全不同的数据集方面存在差异。然而,这个错误在python代码中的所有行中都是相同的。

我的怀疑是:

>

  • 每个内核都有一个内存限制。
  • 有一段时间之后,过程从字面上收集-发现过程没有结束并放弃。

    线程9中的异常

    Traceback(最近的调用最后):

    文件"C:\Program Files\Python\WinPython-64bit-3.4.4.4Qt5\python-3.4.4.amd64\lib\threading.py",行911,_bootstrap_innerself.run()

    文件“C:\Program Files\Python\WinPython-64bit-3.4.4.4Qt5\Python-3.4.4.amd64\lib\threading.py”,第859行,运行中的self.\u目标(*self.\u args,**self.\u rgs)

    文件“C:\Program Files\Python\WinPython-64bit-3.4.4.4Qt5\Python-3.4.4.amd64\lib\multiprocessing\pool.py”,第429行,在_handle\u results task=get()中

    文件“C:\Program Files\Python\WinPython-64bit-3.4.4.4Qt5\Python-3.4.4.amd64\lib\multiprocessing\connection.py”,第251行,在recv return ForkingPickler.load(buf.getbuffer())中

    类型错误:init()缺少1个必需的位置参数:消息

  • 共有3个答案

    松智勇
    2023-03-14

    我在代码中的某个地方抛出了一个自定义异常,它被抛出到我的大多数进程(池中)。大约90%的进程进入睡眠状态,因为这些进程中发生了此异常。但是,我没有得到正常的回溯,而是得到了这个神秘的错误。不过,我的是Linux。

    为了调试它,我删除了池并按顺序运行代码。

    亢保赫
    2023-03-14

    多亏了Robert——关注lang detect,我发现我的一个文本条目可能是空的

    LangDetectException:文本中没有功能

    新手犯的错误——可能是由于编码错误——在过滤掉这些错误后重新运行——会让你(Robert)保持状态。

    仉运乾
    2023-03-14

    我认为问题是lang检测在这里悄悄声明了一个隐藏的全球探测器工厂https://github.com/Mimino666/langdetect/blob/master/langdetect/detector_factory.py#L120:

    def init_factory():
        global _factory
        if _factory is None:
            _factory = DetectorFactory()
            _factory.load_profile(PROFILES_DIRECTORY)
    
    def detect(text):
        init_factory()
        detector = _factory.create()
        detector.append(text)
        return detector.detect()
    
    
    def detect_langs(text):
        init_factory()
        detector = _factory.create()
        detector.append(text)
        return detector.get_probabilities()
    

    根据我的经验,这种情况可能会导致多处理出现问题,因为它与多处理试图在进程之间共享内存中的资源以及管理工作进程和主进程中的名称空间的方式相冲突,尽管在这种情况下,确切的机制对我来说是一个黑匣子。我通过向我的池初始化函数添加init\u factory函数的调用来修复它:

    from langdetect.detector_factory import init_factory
    def worker_init_corpus(stops_in):
        global sess
        global stops
        sess = requests.Session()
        sess.mount("http://", HTTPAdapter(max_retries=10))
        stops = stops_in
        signal.signal(signal.SIGINT, signal.SIG_IGN)
        init_factory()
    

    仅供参考:“sess”逻辑是为每个工作人员提供一个http连接池,用于请求,以解决在将该模块与多处理池一起使用时出现的类似问题。如果您不这样做,工作人员将通过父进程备份所有http通信,因为默认情况下隐藏的全局http连接池就在父进程中,然后一切都非常缓慢。这是我遇到的问题之一,让我怀疑这里也有类似的原因。

    另外,为了进一步减少潜在的混淆:stops用于向映射函数提供我正在使用的stopword列表。而信号调用是在用户中断(ctrl-c)时强制池很好地退出。否则,它们往往会成为孤儿,在父进程死亡后继续艰难前行。

    然后我的池是这样初始化的:

    self.pool = mp.Pool(mp.cpu_count()-2, worker_init_corpus, (self.stops,))
    

    我还包装了我的调用检测在一个try/catLangDetectExec0019块:

    try:
        posting_out["lang"] = detect(posting_out["job_description"])
    except LangDetectException:
        posting_out["lang"] = "none"
    

    但这并不能单独解决问题。非常有信心,初始化就是解决方案。

     类似资料:
    • 我无法通过错误: 我检查了几个教程,但似乎没有什么不同于我的代码。我唯一能想到的是Python3.3需要不同的语法。 如果我理解正确,会自动传递给构造函数和方法。我做错了什么?

    • 我正在学习python。我创建了一个包含2个方法的类可视化工具。现在我想在第二个方法中调用第一个方法。我读到我必须使用self: 这很有效。现在我添加了其他参数: 我从我的调用它: 现在我得到一个错误: 我检查了,参数3在那里,参数序列是相同的。我认为它与自我冲突。 我怎样才能解决这个问题?我的类中是否需要init方法? 编辑:在我的主页上:

    • 问题内容: 我是python新手,碰壁了。我遵循了一些教程,但无法克服错误: 我检查了一些教程,但似乎与我的代码没有什么不同。我唯一能想到的是python 3.3需要不同的语法。 主要技巧: 泵类: 如果我正确理解,“自我”将自动传递给构造函数和方法。我在这里做错了什么? 我正在将Windows 8与python 3.3.2一起使用 问题答案: 你需要在此处实例化一个类实例。 采用 小例子

    • 我尝试在谷歌中找到解决方案,但谷歌中的所有解决方案都不适合我,也许在这里我得到了正确的答案。 我有以下代码: 我得到了这个错误: 回溯(最后一次调用):文件“位置文件”,第42行,在g=gui_main()文件“位置文件”的第26行,在init btn_next=按钮(self.win_about,text=“next”,fg=“red”,command=gui_main.screen_menu(

    • 问题内容: 我正在开发一个游戏作为附带项目,很有趣,但是遇到了这个错误,我真的不知道为什么会发生… 这是代码: 我这样称呼它: 我得到的错误是: 有任何想法吗? 问题答案: 您不应直接调用类方法,而应创建该类的实例: 要详细说明该错误,您将得到: TypeError:turn()缺少1个必需的位置参数:“ playerImages” 这是因为需要第一个参数()的实例。类方法总是将实例作为第一个参数

    • 我是matplotlib的新手,我试图将文本设置为图形中的一个点,但我有错误: Traceback(最近一次调用):文件main.py,第239行,在main()文件main.py,第232行,在mainp.show_graphic_ortg_drtg()文件/home/josecarlos/Workspace/python/进程/process.py,第363行,show_graphic_ort