【问题标题】:multiprocessing.pool.MaybeEncodingError: Error Sending resultsmultiprocessing.pool.MaybeEncodingError:发送结果时出错
【发布时间】:2019-09-19 06:46:19
【问题描述】:

有人能解释一下下面的错误吗?

multiprocessing.pool.MaybeEncodingError:错误发送结果: '[>]'。
原因:'NotImplementedError("[E112] 不支持酸洗跨度, 因为跨度只是父文档的视图,不能存在于它们的 自己的。腌制的跨度总是必须包括它的 Doc 和 Vocab, 与腌制父文档相比,这几乎没有缺点 直接地。因此,不要腌制跨度,而是腌制它所属的 Doc 到或使用 Span.as_doc 将 span 转换为独立的 Doc 对象。")'

下面是我的代码:

resume_parser2.py

class Resume_parser2(object):
    inputString = ''
    skill = ['Java']
    def __init__(self, resume):
        self.__matcher = Matcher(nlp.vocab)
        self.__skills = {
            'skills'    : None
        }
        self.__text        = utils.extract_text(self.__resume, os.path.splitext(self.__resume)[1])
        self.__text        = ' '.join(self.__text.split())
        self.__nlp         = nlp(self.__text)
        self.__noun_chunks = list(self.__nlp.noun_chunks)


    def __get_basic_details(self):
        skills = utils.extract_skills(self.__nlp,self.__noun_chunks)
        self.__skills['skills'] = skills
        return

    def check_skills(self):
        skill = ['Java']
        if skill in self.__skills:
            return self.__skills

def filtered_resume(resume):
    parser = Resume_parser2(resume)
    return parser.check_skills

if __name__ == '__main__':
    pool = mp.Pool(mp.cpu_count())
    resumes = []
    data = []
    for root, directories, filenames in os.walk('resumes'):
        for filename in filenames:
            file = os.path.join(root, filename)
            resumes.append(file)

    results = [pool.apply_async(filtered_resume, args=(x,)) for x in resumes]
    results = [p.get() for p in results]

utils.extract_text 是从文件中提取文本的函数,utils.extract_skills 是从文件中提取技能集的函数。这两个都在提取数据。

Api.py

from resume_parser2 import Resume_parser2
from flask import Flask, request, redirect, url_for,send_from_directory, jsonify
from werkzeug.utils import secure_filename
import json
import multiprocessing as mp
import pandas as pd
import os

direct = 'E:/parsertool/backupresumes'

app = Flask(__name__)

def print_cyan(text):
    print("\033[96m {}\033[00m" .format(text))

def extract_from_directory(directory):
    if os.path.exists(directory):
        pool = mp.Pool(mp.cpu_count())
        resumes = []            
        for root, directories, filenames in os.walk(directory):
            for filename in filenames:
                extension = os.path.splitext(filename)[1]
                if (extension == '.pdf' or extension == '.docx'):
                    file = os.path.join(root, filename)
                    resumes.append(file)
        results = pool.map(filtered_resume, resumes)
        pool.close()
        pool.join()
        return results
    else:
        return 'Directory not found.'


def filtered_resume(resume):
    parser = Resume_parser2(resume)
    return parser.check_skills


@app.route('/', methods=['GET', 'POST'])
def upload_file():
    if request.method == 'POST':
        #files = request.files.getlist('files')
        #folder = dirname(files[0].filename)
        #print(folder)
        return jsonify(extract_from_directory(direct))


if __name__ == '__main__':
    app.run(debug=True)

这里我无法理解错误。有人能解释一下这个错误是什么或如何解决吗?

【问题讨论】:

    标签: python-3.x flask multiprocessing python-multiprocessing


    【解决方案1】:

    错误信息很有帮助。在代码中的某处,您尝试使用 pickle 来保存包含跨度的对象。这些跨度可能是从self.__nlp = nlp(self.__text) 生成的,尝试将self.__noun_chunks = list(self.__nlp.noun_chunks) 的结果转换为字符串可能类似于self.__noun_chunks = [str(x) for x in self.__nlp.noun_chunks]

    还可以使用调试器检测包含 span 的其他对象,然后尝试使用 pickle 转储它们。

    【讨论】:

      【解决方案2】:

      那段代码有点复杂,所以我没有尝试重现,但首先尝试更改:

      def filtered_resume(resume):
          parser = Resume_parser2(resume)
          return parser.check_skills
      

      to(注意第 3 行末尾添加的括号):

      def filtered_resume(resume):
          parser = Resume_parser2(resume)
          return parser.check_skills()
      

      更长的(可能的)解释:

      Python pickles(本质上是序列化)进程之间传递的任何数据。因此,在这种情况下,filtered_resume 返回的结果在返回到原始进程之前会被腌制。

      我猜,return parser.check_skills 末尾没有括号,filtered_resume 函数将返回 方法 check_skills,而不是调用它并返回结果 (@987654327 @)。因此 Python 尝试腌制 check_skills 函数。酸洗方法应该没问题,但是这个方法需要酸洗整个Resume_parser2 对象(至少因为它包含对self 的显式引用,可能是因为Python 无论如何都会酸洗对象,因为check_skills 是对象的一部分)。

      腌制对象,就像方法一样,应该没问题。但是,如果nlp 是对 spaCy 对象的引用(我猜是这样),那么您就会开始遇到酸洗 spaCy 对象所带来的一些奇怪现象。同样,我只是在猜测,但我假设 __noun_chunks 是 spaCy 生成的一组跨度,因此当 Resume_parser2 对象被腌制时,它会尝试腌制 __noun_chunks 并且 spaCy 抱怨因为它们是跨度。

      如果您进行我上面推荐的更改,它应该只是尝试腌制__skills 变量,并且假设它不包含跨度,它应该腌制得很好。但是,如果这不起作用,则必须更新代码以摆脱跨度或将它们转换为 spaCy 文档(如错误消息本身所述)...我们可以在来时越过那座桥给它。

      【讨论】:

        猜你喜欢
        • 2018-07-23
        • 2015-05-20
        • 2019-10-11
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 2013-09-30
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多