首页 > 解决方案 > 使用“NoneType”对象失败的多处理(pool.map)不可调用

问题描述

无法弄清楚这个错误返回multiprocessing.pool.map。能得到一些帮助会很棒。

这是设置的简化版本:我在一个类中有两个方法。当类的对象被实例化时,该_get_topics()方法被执行。该方法然后_execute_ners()通过多处理执行该方法。

from multiprocessing import Pool 

class NaturalCommunication:

    def __init__(self, 
                 text,
                 **kwargs):

        self.text = text
        self.topics = self._get_topics()
    
    def _get_topics(self):
        """
        Extract topics from text.
        """
        p = Pool(processes=3)
        data = p.map(self._execute_ners, ['ner1', 'ner2', 'ner3'])
        p.close()

        return data

    def _execute_ners(self, ner_name:str) -> dict:
        entities = {}
        for i, sentence in enumerate(self.text.sents):
            entities[i] = []

            if ner_name == 'ner1': 
                # Execute ner number 1
                ner = NerNumberOne(#some config files)
                ner.get_entities(#some config files)
                entities[i] += ner.entities #get entities return from ner1
            
            if ner_name == 'ner2':
                # Execute ner number 2
                ner = NerNumberTwo(#some config files)
                ner.get_entities(#some config files)
                entities[i] += ner.entities #get entities return from ner2

            if ner_name == 'ner3':  
                ner = NerNumberThree(#some config files)
                ner.get_entities(#some config files)
                entities[i] += ner.entities #get entities return from ner3

        return entities

我相信发生的问题在某种程度上是由于返回的格式entities。如果我更改_execute_ners()为仅返回“字符串”,则数据变量_get_topics()将成功填充。在这种情况下,_execute_ners()返回一个填充了我们定义为StackExchangeEntity对象的字典(您可以在下面的错误语句中看到返回的格式。

这是该行的错误输出data = p.map(...)

发生异常:MaybeEncodingError 错误发送结果:'[{0: [StackExchangeEntity(('visa', 'ner1'))], 1: [StackExchangeEntity(('time', 'ner3')), StackExchangeEntity(('time ', 'ner2'))]}]'。原因:'TypeError("'NoneType' 对象不可调用")'

这似乎是 pool.map 模块中的内部错误,还是我遗漏了什么?

标签: pythonmultiprocessing

解决方案


推荐阅读