spacy调用nlp.pipe多进程处理时报RuntimeError冻结问题如何解决?
问题触发诱因
报错核心原因是你调用nlp.pipe时指定了n_process=-1开启多进程处理,Windows、macOS系统默认的多进程启动方式为spawn而非Linux默认的fork:spawn模式下新启动的子进程会重新导入整个主模块的代码,若启动多进程的逻辑没有被if __name__ == '__main__'保护块包裹,子进程导入代码时会再次执行到启动多进程的逻辑,陷入无限递归启动新进程的循环,因此触发该运行时错误。
排查步骤
- 确认运行环境是否为Windows/macOS,只有默认使用
spawn启动多进程的系统会出现该问题 - 检查开启多进程的代码(本次为
nlp.pipe指定n_process=-1的逻辑)是否未放在if __name__ == '__main__'块中 - 额外注意原代码中
>是HTML转义字符,属于输入错误,实际编写时需替换为>,否则会先触发语法错误
修复方案
有两种可行修复方式:
方案1:保留多进程加速
将所有主执行逻辑放入if __name__ == '__main__'保护块中,避免子进程重复执行多进程启动代码,修复后代码如下:
import pandas as pd import spacy def trata_textos(doc): tokens_validos = [] for token in doc: e_valido = not token.is_stop and token.is_alpha if e_valido: tokens_validos.append(token.text) if len(tokens_validos) > 2: return ' '.join(tokens_validos) if __name__ == '__main__': dados = pd.read_csv('treino.csv') nlp = spacy.load('pt_core_news_sm') textos_para_tratamento = (titulos.lower() for titulos in dados['title']) textos_tratados = [trata_textos(doc) for doc in nlp.pipe(textos_para_tratamento, batch_size= 1000, n_process = -1)]
方案2:关闭多进程
若数据量不大不需要多进程加速,直接将nlp.pipe的n_process参数改为1,无需添加保护块即可直接运行。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

